我做了一个简单的server,可以连接多个client,其中client可以通过server端得到数据库中存储的一些数据,由于数据量较大,我将每5行数据做成一条单独的消息,发送给客户端。
例如 消息格式<prg><data>.........(数据)</data></prg>
当我的数据超过5行的时候,比如说20行,就有4条上面的消息。
可是我在client端看到的消息却是3条,或者更少。
他会出现一条消息的前一部分在上一条消息中,后一部分在这一条消息中,就像
消息1><prg><data>..........(数据)</data></prg><prg><data>.....
消息2:.....(数据)</data></prg><prg><data>........
这样的情况。是不是因为你在server端调用send(msg)的时候,是将msg发到发送缓冲区了,而我的几条消息同时在发送给同一个client的缓冲区的时候,系统自动将几条消息重新截取发送??

解决方案 »

  1.   

    看你发送端接收端buffer怎么使用的,会不会存在冲突?
      

  2.   

    TCP协议会自动把你各次所发出的数据重新组合(次序不变),每次接收到的数据与每次send不一定是一一对应的,你需要循环接收数据。
      

  3.   

    为了避免粘包现象,可采取以下几种措施。一是对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。我想用上面的第一种方法,但是我找不到push这个函数呀,请问有人用过这个吗