首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux上关闭()套接字的正确方法,Linux和Windows之间的区别?

在Linux上关闭()套接字的正确方法,Linux和Windows之间的区别?
EN

Stack Overflow用户
提问于 2012-10-10 18:17:27
回答 2查看 4.7K关注 0票数 4

我正在上丢失套接字上的数据,因为我正在做一个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.打电话给密闭盒。

我的问题

  • 在Linux下,什么等同于等待FD_CLOSE (步骤1)?

我得到的答案和评论,认为我是问关于Windows上的行为。我是在询问Linux上的行为,我只是引用Windows文档,因为它比Linux手册更加清晰和完整。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-11 07:07:24

在我对close()没有正确关闭套接字的详细答复中遵循了MSDN的建议。这与雷米·莱博的答案本质上是一样的。

票数 5
EN

Stack Overflow用户

发布于 2012-10-10 22:04:46

请注意您引用的Microsoft文档是如何说:“一种等待通知的方法.”使用WSAEventSelect。这意味着这不是唯一的办法。同样的文档还描述了通过WSARecv()使用“重叠接收呼叫”的类似方法。但是,更常见的(而不是事件驱动的)方法是调用shutdown(),然后在循环中调用recv(),直到它返回0(优美断开)或SOCKET_ERROR (-1),然后调用closesocket()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12825774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档