我正在用C ++开发两个使用C Linux套接字调用,服务器和客户端的应用程序。 服务器侦听特定端口A并使用accept函数检索连接。 我正在使用int result = :: listen(mySocketFileDescriptor,1);将最大连接数限制为1。 顺便说一句,在服务器中我使用SO_REUSEADDR选项来重用套接字有其他原因。
如果客户端有多个断开/连接,有时会发生奇怪的行为: 例如,客户端成功连接到服务器,但是当它发送数据时,服务器不会收到任何内容。
在客户端应用程序中,我使用Linux自动分配的端口连接到端口A,我们称之为B. 使用netstat我发现客户端从套接字连接到服务器到端口A. 使用端口B和另一个使用另一个端口C.我调试了,我已经看到了 当客户端在使用C的套接字上写入时,服务器从使用B的套接字读取。
有关此行为原因的任何想法吗?
除了我的代码可能存在的任何逻辑问题之外,是否可以制作服务器 在建立新连接时,总是丢弃旧连接?我可以设置任何选项吗?
提前谢谢!
答案 0 :(得分:2)
您需要更彻底地阅读listen
manual page,因为“限制”不是可以对该套接字建立的最大连接数,它是可以尝试同时连接的连接数的限制在致电accept
之前。拨打accept
后,即可建立另一个连接。
许多示例中的“标准”值为5
,但这些服务器可以处理数百个连接。
答案 1 :(得分:1)
网络连接一端的机器识别另一端已断开连接并不简单。特别是,如果远程端突然切断连接而不是正确关闭连接,则很难这样做。
此外,没有任何东西可以防止相同的两台机器建立多个同时连接。如果要将其限制为仅一个,那么您的服务器需要跟踪它当前连接到哪个客户端,并且必须准备好同时为多个连接提供服务,以便识别新连接何时由现有客户建立。这需要多路复用(例如使用select()
)或多处理。然后,如果它从已经有一个连接的客户端收到新连接,则服务器停止处理旧连接并关闭它。