欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

socket通信如何处理每次包长度不定问题

程序员文章站 2022-12-14 23:37:19
说起来,这是一个漫长的问题: 客户端和服务器通信的结构是:包头+数据长度+数据 客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200; 服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=XX,后面跟一 ......

说起来,这是一个漫长的问题:

客户端和服务器通信的结构是:包头+数据长度+数据

客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200;

服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=xx,后面跟一大串数据;发完以后,再发一个结束的包:包头=end,长度-1,data=无效值。

在服务器端,在while循环里不停的recv:先recv包头,在recv长度。如果判断是数据,然后recv数据。如果判断是结束包,那么break出循环。

这个看似没有问题的程序,实际存在一个问题:

在客户端,recv包头和长度后,recv数据,可能出现数据并没有全部传过来的情况,比如recv长度后,得知后面的数据有15000字节。但是由于阻塞等原因,只传过来了7000字节。那么按照原来程序的逻辑,就会在下一次recv包头和长度时,将实际发送的剩下的8000字节当做新一包的包头,然后解包,这样就出现了错误。

我的处理办法是,如果recv数据时,实际收到的长度不等于发送数据长度,那么就搞一个小的while循环,在循环中把这一包收满(为了保证收满,可以sleep(10)),然后跳出来,继续收下一包,就解决了。

这个办法是很土,但是由于每包的长度不定,所以暂时只能想到这个办法解决。