当前位置:   article > 正文

winsock recv函数使用注意

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其他方法来判断是否有数据需要接收!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/147033?site
推荐阅读
相关标签
  

闽ICP备14008679号