当遇到这样的情况,如果有一个数据段发送send()过来,包头中包含了数据段的长度,但可能你不知道如何分配多大空间来接收它算合适,也许你会开僻一个足够大的空间来接收,但这种方法不尚妥当,其实理解了tcp中send()与recv()这两个函数的工作原理你就知道怎么处理了。
其实send()与recv()只是负责在应用层进行投递,如物流中的快递员,中间怎么走它们不管,所以它们是非阻塞的函数;一般的,recv()中有四个参数,最后一个参数我们常给0,意思就是说,recv中将要从缓冲区中取走指定长度的数据,并且从缓冲区中删除取走的这部分数据,而如果用参数MSG_PEEK的话,就只是从中读取,读多少次都没有问题。所以针对以上的情况,如果你知道send()过来的数据包的包格式,先recv(fd,buff,size,0),先把存储数据长度的那段读走并删除缓冲区中的这部分数据,然后再recv(fd,buff2,size2,0)将剩下的那部分数据读出来,当然,你也可以在第一次只读不删除recv(fd,buff,size,MSG_PEEK),读得表示数据长度那段,经特殊处理如数据段长度为len2,则char buff2 = new char[len2]这样就可以分配合适的空间来接收数据段信息,再通过recv(fd,buff2,size2,0)读出数据段出来。
评论