Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;套接字并发服务器_C++_Sockets_Concurrency - Fatal编程技术网

C++ C++;套接字并发服务器

C++ C++;套接字并发服务器,c++,sockets,concurrency,C++,Sockets,Concurrency,我正在编写一个并发服务器,它应该有一个通信通道和一个数据通道 客户端最初连接到通信通道以进行身份验证,在成功进行身份验证后,客户端随后连接到数据通道以访问数据 我的程序已经在这样做了,我正在使用线程。我唯一的问题是,如果我尝试连接另一个客户端,我会得到一个“无法绑定:地址已在使用”错误 我是这样想的: A部分 客户端连接到端口4567(并输入其登录信息)。生成一个线程来处理客户端(对每个连接的客户端重复)。在创建的线程中,我有一个函数(我们称之为FUNC_a),用于检查客户端的登录信息(不必担心

我正在编写一个并发服务器,它应该有一个通信通道和一个数据通道

客户端最初连接到通信通道以进行身份验证,在成功进行身份验证后,客户端随后连接到数据通道以访问数据

我的程序已经在这样做了,我正在使用线程。我唯一的问题是,如果我尝试连接另一个客户端,我会得到一个“无法绑定:地址已在使用”错误

我是这样想的:

A部分 客户端连接到端口4567(并输入其登录信息)。生成一个线程来处理客户端(对每个连接的客户端重复)。在创建的线程中,我有一个函数(我们称之为FUNC_a),用于检查客户端的登录信息(不必担心检查是如何完成的),如果成功,线程将启动数据服务器(在8976上侦听),然后在收到客户端尝试连接到数据服务器的请求后,向客户端发送OK

乙部 客户机连接到数据服务器后,从FUNC_a内部接受客户机,并生成另一个线程来处理客户机与数据服务器的连接(希望一切都清楚)。 现在,一切正常。然而,若我试图在第二个客户端到达B部分时连接它,我会得到一个“无法绑定错误:地址已在使用”。我尝试了很多不同的方法,我甚至尝试了生成一个线程来启动数据服务器并接受客户端,然后启动另一个线程来处理该连接。还是不走运

请给我一个建议,说明我做错了什么,我该如何做,或者最好的实施方法是什么。
谢谢

您的问题在于:“…线程启动数据服务器(侦听8976)

如果我理解正确的话,每次客户端连接时,您都试图开始监听端口8976。然而,问题是在给定端口上只能有一个套接字侦听。当您再次尝试在同一端口上开始侦听时,会出现该错误

因此,您有两种选择:

  • 让服务器监听任何空闲端口(绑定时只需指定0),并将端口号发送给客户端,以便客户端可以连接到该端口
  • 在开始时只启动服务器一次,并让它接受客户端连接
  • 然而,第二种选择有一个大问题:你将如何区分一个客户和另一个客户?因此,我建议选择第一个选项


    值得思考的是:您所描述的内容几乎就是FTP的工作原理。FTP服务器使用第一个选项。也许不是巧合吧?;-)

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