我在我的插座上是 losing data ,因为我正在做 close()
.
特定于Linux的shutdown()联机帮助页没有帮助:
shutdown()调用导致与sockfd关联的套接字上的全双工连接的全部或部分关闭 . 如果SHUT_RD如何,将不允许进一步接收 . 如果SHUT_WR如何,则不允许进一步传输 . 如果SHUT_RDWR如何,将不允许进一步的接收和传输 .
微软的MSDN好多了,但它是特定于Windows的,它与Linux之间存在差异:
为了确保在连接的套接字关闭之前发送和接收所有数据,应用程序应该在调用closesocket之前使用shutdown来关闭连接 . 等待远程端已发送其所有数据并启动正常断开连接的通知的一种方法是使用WSAEventSelect函数,如下所示:1 . 调用WSAEventSelect以注册FD_CLOSE通知 .
2.使用how = SD_SEND调用shutdown .
3.收到FD_CLOSE时,调用recv或WSARecv直到函数成功完成并指示接收到零字节 . 如果返回SOCKET_ERROR,则无法进行正常断开连接 .
4.调用closesocket .
我的问题
- 在Linux下,等待
FD_CLOSE
(步骤1)的等价物是什么?
我得到的答案和评论认为我在询问Windows上的行为 . 我在询问Linux上的行为,我只是引用Windows文档,因为它比Linux手册更清晰,更完整 .
2 回答
在我对close() is not closing socket properly的详细解答中遵循了MSDN建议 . 这与Remy Lebeau's答案基本相同 .
请注意Microsoft文档如何说"One method to wait for notification" . 这意味着它不是唯一的方法 . 更常见(而不是事件驱动)的方法是调用
shutdown()
,然后在循环中调用recv()
,直到它返回0(正常断开连接)或SOCKET_ERROR
,然后调用closesocket()
.