赞
踩
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其他方法来判断是否有数据需要接收!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。