C ++套接字并发服务器

时间:2010-05-12 03:00:41

标签: c++ sockets concurrency

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

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

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

我这样做:

A部分

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

B部分

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

请给我一个关于我做错了什么的建议,我该如何做到这一点或者实施它的最佳方式是什么。 谢谢

1 个答案:

答案 0 :(得分:3)

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

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

因此,您有两种选择:

  1. 让服务器监听任何可用的端口(绑定时只指定0),并将端口号发送给客户端,以便客户端可以连接到它。
  2. 仅在开始时启动服务器一次,并让它接受客户端连接。
  3. 然而,第二种选择有一个很大的问题:你如何告诉另一个客户?因此,我建议使用第一个选项。

    一些值得思考的东西:你所描述的几乎就是FTP的工作方式。 FTP服务器使用第一个选项。也许并非巧合? ; - )

相关问题