gpt4 book ai didi

C++套接字并发服务器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:04 24 4
gpt4 key购买 nike

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

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

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

我是这样的:

A 部分

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

B部分

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

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

最佳答案

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

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

因此,您有两个选择:

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

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

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

关于C++套接字并发服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com