我在使用简单的基于C的服务器时发现了一些奇怪的事情
我的Linux(4.10.3)系统上的程序。我不小心结束了电话
我有一个套接字(来自服务器进程)两次listen()
之前叫bind()
。我注意到两个听电话
成功没有任何错误。事实上,它似乎并不重要
我打电话听,所有听的呼叫都成功了。
我期待在第一次失败后听到所有的电话
与EADDRINUSE
。我错过了什么吗? Linux / POSIX手册页没有
似乎对此有所说明。我确实找到了一个参考
以下网页上的此行为:
https://www.mkssoftware.com/docs/man3/listen.3.asp
应用程序可能会在同一个套接字上多次调用listen()。 这具有更新当前积压以进行收听的效果 插座。是否应该有比新积压更多的挂起连接 值,超出的挂起连接被重置和删除。
我不清楚这是否也适用于Linux。所以我的问题是: 当不止一次在同一个套接字上调用listen时会发生什么 同样的过程? (显然用户空间没有明显的副作用, 但Linux内核在内核空间中做了哪些特别的事情?)
感谢。
答案 0 :(得分:2)
Linux内核使用新的积压值调整积压队列长度,但仅用于将来的连接请求。它不会丢弃队列中已有的任何挂起的连接。
对listen()
的第二次和后续调用没有其他影响,除非套接字类型错误(不是SOCK_STREAM
),或者处于错误状态(已连接到特定的同伴,或者已经处于被关闭状态。)