【问题标题】:C++ socket concurrent serverC++ 套接字并发服务器
【发布时间】:2010-05-12 03:00:40
【问题描述】:

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

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

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

我是这样的:

A部分

客户端连接到端口 4567(并输入他的登录信息)。产生一个线程来处理客户端(对每个连接的客户端重复)。在创建的线程中,我有一个函数(我们称之为 FUNC_A)检查客户端的登录信息(不用担心检查是如何完成的),如果成功,线程启动数据服务器(监听 8976),然后向客户端发送 OK,一旦收到,客户端就会尝试连接到数据服务器。

第二部分

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

请给我一个建议,告诉我我做错了什么,我该怎么做或者最好的实现方法是什么。 谢谢

【问题讨论】:

    标签: c++ sockets concurrency


    【解决方案1】:

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

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

    因此,您有两种选择:

    1. 让服务器监听任何空闲端口(绑定时只需指定 0),并将端口号发送给客户端,以便客户端可以连接到它。
    2. 只在开始时启动服务器一次,并让它接受客户端连接。

    然而,第二个选项有一个大问题:你将如何区分一个客户和另一个客户?因此,我建议使用第一个选项。

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

    【讨论】:

    • FTP 在被动模式下以这种方式运行。但是,FTP 也有另一个选项可用 - 在 ACTIVE 模式下,FTP 客户端在其末端打开自己的侦听服务器套接字,然后告诉 FTP 服务器连接到哪里,而不是相反。
    • 是的。我认为您需要先初始化服务器套接字,然后才能开始为每个客户端创建线程..
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2012-07-17
    • 2017-07-20
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多