不止一次调用套接字 - 期望的行为?

时间:2017-03-28 19:51:22

标签: c linux sockets

我在使用简单的基于C的服务器时发现了一些奇怪的事情 我的Linux(4.10.3)系统上的程序。我不小心结束了电话 我有一个套接字(来自服务器进程)两次listen() 之前叫bind()。我注意到两个听电话 成功没有任何错误。事实上,它似乎并不重要 我打电话听,所有听的呼叫都成功了。

我期待在第一次失败后听到所有的电话 与EADDRINUSE。我错过了什么吗? Linux / POSIX手册页没有 似乎对此有所说明。我确实找到了一个参考 以下网页上的此行为:

https://www.mkssoftware.com/docs/man3/listen.3.asp

  

应用程序可能会在同一个套接字上多次调用listen()。   这具有更新当前积压以进行收听的效果   插座。是否应该有比新积压更多的挂起连接   值,超出的挂起连接被重置和删除。

我不清楚这是否也适用于Linux。所以我的问题是: 当不止一次在同一个套接字上调用listen时会发生什么 同样的过程? (显然用户空间没有明显的副作用, 但Linux内核在内核空间中做了哪些特别的事情?)

感谢。

1 个答案:

答案 0 :(得分:2)

Linux内核使用新的积压值调整积压队列长度,但仅用于将来的连接请求。它不会丢弃队列中已有的任何挂起的连接。

listen()的第二次和后续调用没有其他影响,除非套接字类型错误(不是SOCK_STREAM),或者处于错误状态(已连接到特定的同伴,或者已经处于被关闭状态。)