c - 使用 listen(1) 的套接字上的两个(错误的)连接

标签 c linux sockets network-programming unix-socket

我正在使用 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/

相关文章:

c - 重定向 VxWorks 串行输入

linux - TCP 堆栈是否曾经在现有连接上发送未经请求的 RST

c# socket 多数据包堆栈

c - 在可能接受输入的同时继续执行循环

c - 使 vim 缩进 C 预处理器指令与其他语句相同

c - 如何从 C 程序中使用 GUI 打开文件夹?

java - 确保 Java Play Framework 始终运行的最佳方法?

php - exec() 不适用于我发送的所有命令

linux - gdb如何从脚本执行目标程序

java - 如何在Java中使用套接字输入/输出流捕获 "event"?