工作进程应该如何在同一端口上侦听

时间:2013-05-26 06:13:41

标签: qt sockets network-programming

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

我知道NGinx和LigHTTPD都有工作进程,只有主人才能侦听端口80。 请让我知道我该怎么做或NGINX或Lighttpd如何实现这一点。

2 个答案:

答案 0 :(得分:1)

您有两种选择:

  • 主进程不接受套接字上的连接,但工作人员会这样做。当连接进入时,其中一个工作人员将随机accept()。您无法控制accept()上被阻止的哪些工作人员会收到它。
  • 只有主进程接受连接。然后,主进程使用带有sendmsg()的{​​{1}}将接受的连接调度到另一个套接字上的工作者。你可以拥有一堆SCM_RIGHTS,一个在主人和每个工人之间,以实现这一目标。

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

答案 1 :(得分:0)

我这样做的方式类似于Threaded Fortune Cookie example,除了我没有从QThread本身派生的FortuneThread类。我希望从QRunnable派生它们,然后将它们传递给QThreadPool

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