多线程服务器问题

时间:2010-02-14 14:57:23

标签: c++ c linux multithreading

我正在linux中编写一个服务API的服务器。

最初,我想在单个端口上使其成为多线程,这意味着我有多个线程处理单个端口上收到的各种请求。

我的一位朋友告诉我,这不应该是它的工作方式。他告诉我,当收到请求时,我首先必须遵循Handshake过程,创建一个正在侦听专用于请求的其他端口的线程,然后将请求的客户端重定向到新端口。

理论上,它非常有趣,但我找不到任何有关如何实现握手和重定向的信息。有人可以帮忙吗?


如果我在解释您的响应时没有错,那么一旦我创建了一个主线程监听端口的多线程服务器,并创建了一个新线程来处理请求,我实际上是在一个端口上进行多线程?

考虑我每秒都收到大量请求的情况。是不是真的,端口上的每个请求现在应该等待“当前”请求完成?如果没有,通信如何仍然完成:假设浏览器发送请求,因此处理此请求的线程必须首先侦听端口,阻止它,处理它,响应然后解除阻塞。

这样,虽然我有“多线程”,但我所使用的只是一个单独的线程,而不是主线程,因为端口被阻塞了。

3 个答案:

答案 0 :(得分:2)

TCP / IP会进行握手,如果你想不出任何理由进行握手而不是你的应用程序没有要求它。

特定于应用程序的握手示例可以用于用户身份验证。


你的同事建议听起来像FTP的工作方式。这不是一件好事 - 现在互联网或多或少地用于使用单个端口的协议,并且命令端口很糟糕。其中一个原因是因为有状态防火墙不是为多端口应用程序设计的;对于以这种方式做事的每个应用程序,它们都必须进行扩展。

答案 1 :(得分:2)

你朋友告诉你的内容类似于被动FTP - 客户端告诉服务器它需要连接,服务器发回端口号,客户端创建到该端口的数据连接。

但你想要做的只是一个多线程服务器。您只需要一个服务器套接字监听并接受给定端口上的连接。一旦自动TCP握手完成,您将从accept函数获得一个新套接字 - 该套接字将用于与刚刚连接的客户端进行通信。所以现在你只需创建一个新线程,将该客户端套接字传递给线程函数。在您的服务器线程中,您将再次致电accept以接受另一个连接。

答案 2 :(得分:1)

看看ASIO's tutorial on async TCP。有一部分接受TCP上的连接,并生成每个与单个客户端通信的处理程序。这就是TCP服务器通常的工作方式(包括HTTP / web,最常见的tcp协议。)

如果您已设置为每个连接创建一个线程,则可以忽略ASIO的异步内容。它不适用于您的问题。 (完全异步并且每个核心有一个工作线程很好,但它可能无法与您的其他环境很好地集成。)