2010-08-21 49 views
0

我正在玩一个网络服务器,使用unix套接字和sendmsg/recvmsg将套接字文件描述符传递给新的服务器进程,而不会丢失任何请求。使用ab进行测试时,我发现客户端连接会徘徊,而apachebench(ab)会显示错误:“apr_poll:指定的超时已过期(70007)”。使用文件描述符传递时预先存在的连接的状态?

我怀疑文件描述符的地址发生了变化,这会导致打开的连接无效,但要确保每次请求结束时连接都关闭并没有什么区别,有几个请求会失败。

在套接字级还有一些额外的怪异或是只是奇怪吗?还有什么我应该考虑的?

编辑:使用PHP作为客户端发出请求也会在周期中停顿。

+0

你通过服务器套接字(调用接受的),或者单独连接插座到其他服务器的过程? – user239558 2012-02-13 10:20:34

+0

@ user239558传递服务器套接字。 – Scott 2012-02-16 22:43:14

回答

0

这相当于试图通过电话线发送电话。这没有任何意义。套接字fd标识连接的端点。如果另一个主机想要连接,则必须自己创建连接。你不能给它一个你的。

+0

我不明白为什么选择这个答案。当然,可以传递一个文件描述符来表示从一个进程到另一个进程的连接。 – user239558 2012-02-13 10:22:09

+0

@ user239558仅从父进程到子进程。 – EJP 2012-02-13 11:53:39

1

这有一定道理,如果你有这一个插座上听(接受传入的连接),一个主服务器和你有多个工作进程。

可以选择一个合适的/自由工作者(例如,基于每一个工人使用的TCP连接的数目),并通过从主到工人传入连接的描述符。这有助于避免多个工作人员在公共端点上收听时的“雷鸣群体”。