提及来,这是一个漫长的问题:服务器
客户端和服务器通讯的结构是:包头+数据长度+数据服务器端
客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200;循环
服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=XX,后面跟一大串数据;发完之后,再发一个结束的包:包头=end,长度-1,data=无效值。request
在服务器端,在while循环里不停的recv:先recv包头,在recv长度。若是判断是数据,而后recv数据。若是判断是结束包,那么break出循环。请求
这个看似没有问题的程序,实际存在一个问题:程序
在客户端,recv包头和长度后,recv数据,可能出现数据并无所有传过来的状况,好比recv长度后,得知后面的数据有15000字节。可是因为阻塞等缘由,只传过来了7000字节。那么按照原来程序的逻辑,就会在下一次recv包头和长度时,将实际发送的剩下的8000字节当作新一包的包头,而后解包,这样就出现了错误。通信
个人处理办法是,若是recv数据时,实际收到的长度不等于发送数据长度,那么就搞一个小的while循环,在循环中把这一包收满(为了保证收满,能够sleep(10)),而后跳出来,继续收下一包,就解决了。数据
这个办法是很土,可是因为每包的长度不定,因此暂时只能想到这个办法解决。
客户端