我在Linux(4.10.3)系统上使用简单的基于C的服务器程序时,发现了一些奇怪的事情。 我不小心结束了调用listen()
两次在一个套接字(从服务器进程)我已经在早些时候调用bind()
。 我注意到,这两个监听调用成功没有任何错误。 事实上,听多less个电话听我都不重要,所有的电话听都成功了。
我期待所有的电话后,第一个听EADDRINUSE
失败。 我错过了什么吗? Linux / POSIX手册页似乎没有说这个。 我在下面的网页上find了关于这种行为的一个参考:
https://www.mkssoftware.com/docs/man3/listen.3.asp
应用程序可以在同一套接字上多次调用listen()。 这具有更新监听套接字的当前积压的效果。 如果有更多待处理的连接比新的待办事项值多,则多余的挂起连接将被重置并丢弃。
我不清楚这是否也适用于Linux。 所以我的问题是:当在同一进程中多次调用同一个套接字时,会发生什么情况? (显然在用户空间中没有可见的副作用,但是Linux内核在内核空间中做了什么特别的事情?)
谢谢。
Linux内核使用新的积压值调整积压队列长度,但仅限于将来的连接请求。 它不会丢弃已经在队列中的任何挂起的连接。
第二次和以后的listen()
调用没有其他作用,除非套接字类型错误(不是SOCK_STREAM
),或者处于错误的状态(已经连接到特定的对等端,或者已经在进程中)被关闭)。