winsock recv函数使用注意

Winsock

int recv(
  SOCKET s,       
  char FAR *buf,  
  int len,        
  int flags       支持MSG_WAITALL
);


在使用这个函数的时候为了能够一次性接收客户端的封包,我尝试使用了MSG_WAITALL的标志,但是这个标志使用上竟然有点奇怪,网上资料也相对比较少,最后在不断
测试和尝试中发现MSG_WAIALL中的recv传递的参数len必须要与接下来接收的数据长度一致,如果这个len长度过长而接收的数据不够长,则recv返回0表示客户端已经
完全断开连接了,但是实际上客户端是没有断开连接的,为什么呢?这有可能客户端发送的数据和之前协商的协议规定不一致,又或者客户端发送的数据长度计算出错
而导致的,后面想了一下这个标志位很有用,因为我们可以利用recv产生一次性完整接包的策勒,比如:
recv(s,buf,len,0)  其中len是等于4,表示接收数据4个字节,接收到了从这个4个字节读取接下来的封包实际数据大小,然后我们再调用 
recv(s,buf,len,
MSG_WAIALL
) 而此时len是等于封包实际数据大小,这样就可以很方便接收完整的数据了,而不用通过调用select其他方法来判断是否有数据需要接收!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值