套接字关闭后仍处于LISTEN状态
Socket remaining in LISTEN state after closing
所以,我打开一个端口上的套接字,关闭它,并试图打开另一个。在应用程序半重启后(它卸载了大多数库并重新加载它们,等等,所以我没有不必要地打开/关闭)。
我发现在我调用套接字上的close()
之后,它确实从/proc/pid/fd中删除了套接字,但是套接字仍然在netstat -nlp
中侦听:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
(以root身份运行,所以你可以看到它没有绑定到我的进程)
为SO_REUSEADDR
插座,TCP_NODELAY
设置
所以我遇到了一个类似的问题,即使在关闭服务器套接字后,应用程序的套接字仍然处于LISTEN状态:
// Before shutdown
#27 72.23 tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 333/RunTests
#27 72.23 tcp 0 0 127.0.0.1:57412 127.0.0.1:6001 ESTABLISHED 333/RunTests
#27 72.23 tcp 0 0 127.0.0.1:6001 127.0.0.1:57412 ESTABLISHED 333/RunTests
// Call shutdown(srv_socket, SHUT_RDWR)
#27 72.23 tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 333/RunTests
#27 72.23 tcp 0 0 127.0.0.1:57412 127.0.0.1:6001 CLOSE_WAIT 333/RunTests
#27 72.23 tcp 0 1 127.0.0.1:6001 127.0.0.1:57412 FIN_WAIT1 333/RunTests
// Call close(srv_socket)
#27 72.24 tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 333/RunTests
#27 72.24 tcp 0 0 127.0.0.1:57412 127.0.0.1:6001 CLOSE_WAIT 333/RunTests
#27 72.24 tcp 0 1 127.0.0.1:6001 127.0.0.1:57412 FIN_WAIT1 -
// A few ms later
#27 75.03 tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN 333/RunTests
证明@user207421在我们的情况下是正确的:我们认为我们正在关闭服务器套接字,但实际上关闭的是在服务器端代表与客户端连接的套接字(由accept()
返回的那个),而不是实际侦听连接的服务器套接字(由socket()
返回的那个)。
使用shutdown(clt_socket, SHUT_RDWR)
(在客户端连接套接字上),然后使用close(srv_socket)
(在实际的服务器套接字上),效果非常好。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- 套接字关闭后仍处于LISTEN状态