C++套接字并发服务器

5
我正在编写一个并发服务器,它应该有一个通信通道和一个数据通道。
客户端最初连接到通信通道进行身份验证,成功后,客户端将连接到数据通道以访问数据。
我的程序已经实现了这一点,并且我正在使用线程。唯一的问题是,如果我尝试连接另一个客户端,我会收到“无法绑定:地址已在使用中”的错误。
我的实现方式如下:
第一部分:
客户端连接到4567端口(并输入登录信息)。为处理每个连接的客户端生成一个线程。在线程中创建一个函数(我们称之为FUNC_A),用于检查客户端的登录信息(不必担心如何进行检查)。如果成功,则线程启动数据服务器(监听8976端口),然后向客户端发送OK消息。一旦收到OK消息,客户端便会尝试连接到数据服务器。
第二部分:
一旦客户端连接到数据服务器,从FUNC_A内部接受客户端并生成另一个线程来处理客户端与数据服务器的连接(希望一切都很清楚)。
现在,所有这些都运行良好。但是,如果我尝试连接第二个客户端,当它到达第二部分时,我会收到“无法绑定错误:地址已在使用中”的错误。我尝试了很多不同的方法,甚至尝试生成一个线程来启动数据服务器并接受客户端,然后启动另一个线程来处理该连接。但是仍然没有成功。
请给我提供建议,告诉我我做错了什么,如何实现或最佳实现方式。谢谢。
1个回答

3
你的问题在于以下内容: "...线程启动数据服务器(监听8976)..."。
如果我理解正确,每次有客户端连接时,你都在尝试在8976端口上开始监听。然而,问题在于一个给定端口只能有一个套接字在监听。当你再次尝试在相同的端口上开始监听时,就会得到那个错误。
因此,你有两个选择:
1. 让服务器监听任何可用的端口(只需使用0进行绑定),并将端口号发送给客户端,以便客户端可以连接它。 2. 只在开始时启动服务器,并使其接受客户端连接。
然而,第二个选项存在一个大问题:你如何告诉一个客户端和另一个客户端?因此,我建议采用第一种选择。
思考一下:你所描述的情况几乎与FTP的工作方式完全相同。而FTP服务器使用第一种选项。这也许不是巧合吧?;-)

1
FTP在被动模式下运作。然而,FTP还有另一种可用的选项 - 在主动模式下,FTP客户端在其端上打开自己的侦听服务器套接字,然后告诉FTP服务器要连接到哪里,而不是反过来。 - Remy Lebeau
是的,实际上我认为在开始为每个客户端创建线程之前,您需要初始化服务器套接字。 - Zuko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接