MSG_WAITALL应该
阻塞,直到收到所有数据。在recv的手册页中:
该标志请求 *** 作块,直到满足完整请求为止。
但是,网络堆栈中的缓冲区可能不够大,无法容纳所有内容,这就是服务器上出现错误消息的原因。客户端网络堆栈根本无法容纳那么多数据。
解决方案是增加缓冲区大小(的
SO_RCVBUF选项
setsockopt),将消息拆分为较小的片段,或接收较小的块将其放入您自己的缓冲区中。最后是我的建议。
编辑: 我在您的代码中看到您已经按照我的建议进行 *** 作(使用自己的缓冲读取较小的块),因此只需删除该
MSG_WAITALL标志即可。
哦,当
recv返回零时,意味着另一端已关闭连接,您也应该这样做。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)