2010-08-21 50 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連接的數目),並通過從主到工人傳入連接的描述符。這有助於避免多個工作人員在公共端點上收聽時的「雷鳴羣體」。