c++ - 多线程客户端服务器

标签 c++ multithreading sockets unix tcp

您好,我正在完成一项编写多线程客户端服务器的作业。 到目前为止,我所做的是在一个端口中打开一个套接字并 fork 两个线程来监听和写入客户端。但是我需要将两种类型的客户端连接到服务器并以不同的方式为它们提供服务。我的问题是我最好的方法是什么?

我在一个类中处理连接,该类有一个接受连接的无限循环。当连接被接受时,该类创建两个线程来读取和写入客户端?现在如果我想处理另一个不同类型的客户,我们应该怎么做?

我需要打开另一个端口吗?或者是否可以通过同一端口提供服务?如果可以识别套接字中客户端的类型,那么我可以以不同的方式处理消息。

或者你是这样建议的?

  1. 为两种类型的客户端 fork 两个线程,并在不同端口的每个线程中监控入站连接。
  2. 当一个连接被接受时,每个线程都会产生另外两个线程用于监听和写入。

请提出建议。

最佳答案

也许您会从 Unix 用户那里得到更好的答案,但我会提供我所知道的。

您的服务器需要一个线程来打开一个等待传入连接的“监听”套接字。为简单起见,此线程可以是主线程,但如果您关心 UI 交互,则可以是备用线程(例如,在 Windows 中,这是一个问题,不确定 Unix)。听起来您至少做到了这一点。

当“监听”套接字接受连接时,您将获得一个连接到“客户端”套接字的“已连接”套接字。您可以将此“已连接”套接字传递给一个新线程,该线程管理从写入“已连接”套接字的读取。因此,我建议的一项更改是在单个线程中管理“已连接”套接字,而不是像您所做的那样在两个单独的线程(一个用于读取,一个用于写入)中进行管理。可以使用 select() 系统调用来完成对同一个套接字的读取和写入,如图所示 here .

当一个新的客户端连接时,您的“监听”套接字将提供一个新的“已连接”套接字,您将把它交给另一个线程。此时,您有两个线程 - 一个管理第一个连接,一个管理第二个连接。就套接字而言,客户端之间没有区别。您只需要两个打开的连接,一个连接到您的两个客户端。

在这一点上,问题就变成了“以不同方式为他们服务”是什么意思。如果希望客户端以独特的方式与服务器交互,则必须以某种方式确定这一点。可以根据您可以查询的“客户端”套接字的 IP 地址来确定交互,但这似乎是任意的,并且会受到网络变化的影响。它也可以基于从“客户端”套接字接收到的初始数据 block ,指示所需的交互类型。在这种情况下,管理“已连接”套接字的线程可以读取套接字以获得预期的交互类型,然后将套接字交给管理该交互类型的类对象。

希望对您有所帮助。

关于c++ - 多线程客户端服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3984282/

相关文章:

c - 苹果操作系统 X : How is the tcpcb struct of a TCP connection obtained by a kernel extension?

c++ - 在 Arduino 上重载流式传输

c++ - winapi 为什么/如何反转消息的顺序?

c++ - curl 在线程调用中崩溃

java - sleep 时线程中断

python - 使用 Python 套接字从网站读取文本

c - accept() 中断信号和 epoll_wait()

c++ - OpenCV 像素强度

c++ - 函数的可选模板化参数

c++ - 如何使用 C++ 套接字库