注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

C++---关于recv( )的问题  

2012-10-20 03:26:30|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

当遇到这样的情况,如果有一个数据段发送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)读出数据段出来。

  评论这张
 
阅读(799)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018