1

我正在尝试在 QT 中编写一个简单的 Web 服务器来处理 HTTP 请求。我知道 QT 有 QThreads,我可以用它来处理同时连接。我想要的是至少有 2 个工作进程,这样我就可以将大部分请求负载从主进程传递给工作进程。问题是主机正在侦听端口 80,当有传入连接时它会“接受”。我应该如何为工作人员编写代码以接受传入连接?工作进程无法监听与主进程绑定到端口 80 相同的端口。

我知道 NGinx 和 LigHTTPD 有工作进程,只有 master 监听端口 80。请让我知道我应该如何执行此操作或 NGINX 或 Lighttpd 如何实现此操作。

4

2 回答 2

2

你有两个选择:

  • 主进程不接受套接字上的连接,但工作进程接受。当一个连接进来时,它会被accept()随机的一个worker 编辑。您无法控制哪些被阻止的工作人员accept()会收到它。
  • 只有主进程接受连接。然后主进程使用sendmsg()with通过另一个套接字将接受的连接分派给工作人员SCM_RIGHTS。你可以有一堆socketpair()s,一个在 master 和每个 worker 之间,来完成这个。

如果您使用的是工作线程而不是工作进程,那么您不必使用SCM_RIGHTSon a socket 技巧将接受的连接发送给工作人员,因为文件描述符在工作线程中已经有效(没有单独的文件描述符命名空间对于单个进程的单独线程)。在这种情况下,您可以只使用信号量和队列之类的简单信号,让工作人员知道它应该建立一个新连接。

于 2013-05-26T14:22:27.173 回答
0

我这样做的方式类似于Threaded Fortune Cookie 示例,只是我没有从 QThread 本身派生的 FortuneThread 类。我宁愿让它们从QRunnable派生,然后将它们传递给QThreadPool

这样,您可以限制系统中运行的活动线程的数量,并且您不必不断地创建和销毁线程,您只需重复使用它们,直到您的线程池空闲一段时间。

于 2013-05-26T19:06:45.553 回答