我正在使用 C++ 开发两个使用 C Linux 套接字调用的应用程序,一个服务器和一个客户端。 服务器监听特定端口 A 并使用 accept 函数检索连接。 我正在使用 int result =::listen(mySocketFileDescriptor, 1);将最大连接数限制为 1。 顺便说一句,在服务器中,我使用 SO_REUSEADDR 选项出于其他原因重用套接字。
如果与客户端有多次断开/连接,有时会发生奇怪的行为: 例如,客户端成功连接到服务器,但是当它发送数据时,服务器没有收到任何东西。
在客户端应用程序中,我使用 Linux 自动分配的端口连接到端口 A,我们称它为 B。 使用 netstat 我发现客户端从套接字连接到服务器到端口 A 使用端口 B 和另一个使用另一个端口 C. 我已经调试并且我已经看到 服务器从使用 B 的套接字读取,而客户端在使用 C 的套接字上写入。
知道这种行为的原因吗?
除了我的代码可能存在的任何可能的逻辑问题之外,是否有可能使服务器 建立新连接时总是丢弃旧连接?有什么我可以设置的选项吗?
提前致谢!
最佳答案
您需要阅读 listen
manual page更彻底,因为“限制”不是可以与该套接字建立的最大连接数,它是在您调用 accept
之前可以同时尝试连接的连接数的限制。一旦您调用 accept
,就可以建立另一个连接。
许多示例中的“标准”值是 5
,但这些服务器可以处理数百个连接。
关于c - 使用 listen(1) 的套接字上的两个(错误的)连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569593/