我正在上丢失套接字上的数据,因为我正在做一个close()。
Linux特定的shutdown()手册无助于:
关闭()调用将关闭与sockfd关联的套接字上的全部或部分全双工连接。如果SHUT_RD怎么样,进一步的接待将被禁止。如果SHUT_WR是如何,进一步的传输将被禁止。如果SHUT_RDWR是怎样的,进一步的接收和传输将被禁止。
微软的MSDN要好得多,但它是特定于Windows的,它和Linux之间有一些不同:
为了确保在连接的套接字关闭前发送和接收所有数据,应用程序应该在调用closesocket之前使用关机关闭连接。一种等待远程终端发送其所有数据并启动优雅断开的通知的方法使用WSAEventSelect函数如下: 1.调用WSAEventSelect注册FD_CLOSE通知。2.用how=SD_SEND调用关机。3.当FD_CLOSE接收到时,调用recv或WSARecv,直到函数成功完成,并指示接收到零字节。如果返回SOCKET_ERROR,则不可能实现优雅的断开连接。4.打电话给密闭盒。
我的问题
FD_CLOSE (步骤1)?我得到的答案和评论,认为我是问关于Windows上的行为。我是在询问Linux上的行为,我只是引用Windows文档,因为它比Linux手册更加清晰和完整。
发布于 2012-10-11 07:07:24
在我对close()没有正确关闭套接字的详细答复中遵循了MSDN的建议。这与雷米·莱博的答案本质上是一样的。
发布于 2012-10-10 22:04:46
请注意您引用的Microsoft文档是如何说:“一种等待通知的方法.”使用WSAEventSelect。这意味着这不是唯一的办法。同样的文档还描述了通过WSARecv()使用“重叠接收呼叫”的类似方法。但是,更常见的(而不是事件驱动的)方法是调用shutdown(),然后在循环中调用recv(),直到它返回0(优美断开)或SOCKET_ERROR (-1),然后调用closesocket()。
https://stackoverflow.com/questions/12825774
复制相似问题