- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
那里有很多混杂的信息。
我只是想确保数据已完全发送。我应该关闭/关闭还是使用 SO_LINGER 和超时关闭?
我在 Linux 下使用带 epoll 的非阻塞套接字,在 OSX 下使用 kqueue 的相同代码(带定义)。看起来 SO_LINGER 并不总是在所有平台上都以相同的方式工作?
此外,当在非阻塞套接字上使用 SO_LINGER 时,如果返回 EWOULDBLOCK,是否需要再次调用 close 直到没有获得 EWOULDBLOCK?或者在这种情况下我可以忽略 close 中的 EWOULDBLOCK 错误吗?
最佳答案
I just want to ensure that the data is fully sent. Should I be doing shutdown/close
是的,见下文。
or close with SO_LINGER and timeout?
我觉得这根本没有用,见下文。
I'm using non-blocking sockets with epoll under Linux and the same code (with defines) under OSX uses kqueue. It would seem SO_LINGER doesn't always work the same on all platforms?
应该可以,但是谁知道呢?有一篇关于 TCP 实现差异的大论文,据我所知,其中没有提到 SO_LINGER 。但我会在可以的时候检查一下。
Also when using SO_LINGER on a non-blocking socket, If you get back EWOULDBLOCK do you need to call close again until you don't get EWOULDBLOCK? or can I just ignore the EWOULDBLOCK error from close in that case?
理论上,您应该按照 EAGAIN 再次调用 close()
,但我想知道它是否真的有效。将套接字置于阻塞模式以进行关闭会更有意义,因为您无法选择任何内容来告诉您何时写入所有数据。但你仍然遇到一个问题,如果发生超时,套接字将关闭,数据可能会丢失,现在除了记录出现问题的可能性之外,你无能为力。
但是回到你的问题。确保在关闭之前已写入和接收所有数据的方法是关闭两端写入的套接字,然后在两端发出读取,这应该返回流结束(recv()
返回零),然后关闭套接字。这样你就知道两个同行同时结束了,并且已经读取了所有数据。如果 recv()
返回数据,则表明您的应用程序协议(protocol)存在错误。我认为这一切都应该在阻塞模式下进行。
关于linux - 关闭套接字的最佳实践。 SO_LINGER 或关闭/关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22873616/
我正在编写一个多线程winsock应用程序,但我在关闭套接字时遇到了一些问题。首先,同时打开的套接字数量是否有限制?假设一次有 32 个套接字。 我在其中一个套接字上建立了连接,并传递信息,一切顺利。
那里有很多混杂的信息。 我只是想确保数据已完全发送。我应该关闭/关闭还是使用 SO_LINGER 和超时关闭? 我在 Linux 下使用带 epoll 的非阻塞套接字,在 OSX 下使用 kqueue
我编写了以下代码来创建一个echo 服务器(我写入标准输出的数据从我的 PC 移动到服务器并返回到我的 PC)。在代码中,我在套接字中设置了 SO_LINGER 选项。因此,当我按下 Ctrl+C 导
将 SO_LINGER 与 udp 套接字一起使用是否有效? 如果是,您能否描述一下 SO_LINGER 适合 udp 套接字的情况或说明性示例? 一点背景: 我从未使用过 SO_LINGER 选项,
我在一个同时连接到许多 URL 的网站上工作(我们希望达到每分钟约 600 个),无论我尝试什么,总是有数千个 TIME_WAIT 仍然打开。我知道这些对 TCP 连接至关重要,但它们正在使用所有可用
我试图在连接上强制重置 TCP。建议的方法是将 SO_LINGER 设置为 0 并调用 close()。 我正在这样做,但连接仍处于 ESTABLISHED 状态。套接字以非阻塞模式运行。操作系统是
我想我理解选项的正式含义。在我现在处理的一些遗留代码中,使用了该选项。客户提示 RST 作为从其一侧关闭连接时对 FIN 的响应。 我不确定我是否可以安全地删除它,因为我不明白什么时候应该使用它。 您
我正在编写一个使用套接字的跨平台客户端应用程序,该应用程序是用 C++ 编写的。当服务器向我发送信息后,它正在硬关闭套接字,我遇到了问题。 我一直在阅读关于这个主题的其他帖子,我对这种方法的正确与错误
我已阅读 When is TCP option SO_LINGER (0) required?以及其他几个相关的问题和答案,但我无法重现这些帖子中解释的任何 SO_LINGER 行为。我将在这里分享我
我是一名优秀的程序员,十分优秀!