gpt4 book ai didi

linux - 关闭套接字的最佳实践。 SO_LINGER 或关闭/关闭?

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:19 25 4
gpt4 key购买 nike

那里有很多混杂的信息。

我只是想确保数据已完全发送。我应该关闭/关闭还是使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com