2011-08-20 101 views
1

只是一個簡單的背景。我願意爲應用程序的每個線程打開兩個套接字。主線程有accept()調用來接受TCP連接。還有另外三個線程,它們都有accept()。問題有時在多線程環境中,客戶端嘗試在導致「連接被拒絕」錯誤的子線程中接受服務器調用之前進行連接。客戶端不知道服務器何時準備連接 我不希望主線程套接字將任何控制信息發送到客戶端,如「您現在可以連接到服務器」。爲了避免這種情況,我在腦海中有兩種方法 1.在連接拒絕錯誤退出之前,在客戶端設置最大計數器(嘗試)以連接到服務器。 2.一個單獨的線程,其唯一的功能是接受服務器端的連接,作爲除主線程外的所有線程連接的公共接受函數。C中的多個套接字避免連接拒絕錯誤

真的很感激知道是否有其他方法。謝謝

+0

你已經事先調用'listen()'來設置傳入連接的隊列大小,對吧? (AFAIK,不聽不接受根本不應該工作,但是因爲你沒有公開你正在使用哪個操作系統,它可能是一個決定「有幫助」的人,並且在第一次接受時做一個隱含的listen() ))。 –

+0

Hello @HenningMakholm, 感謝您的評論。我添加了充足的隊列大小的聽力。另外,我所使用的操作系統是Linux 2.6.18.它只是主線程沒有任何問題連接,但其他線程隨機具有此連接拒絕錯誤。我不希望線程相互等待,因爲它會挫敗使用線程的目的和應用程序的目標。您的意見非常感謝 Thnks – user369823

回答

0

連接被拒絕並不是因爲你打電話接受遲到,這是因爲你打電話過遲。確保您在任何連接呼叫之前撥打電話(您可以使用strace進行檢查)。這可能需要你在產卵前仔細聆聽。

在您調用套接字監聽之後,傳入的連接將排隊,直到您調用call accept。在某些時候,未接受的連接可能會丟失,但這不應該發生在只有2個或3個套接字的情況下。

如果這是unix,您可以使用pipe2或socketpair創建一對連接的管道/ unix域套接字,代碼少得多。當然,您需要在產生子線程並將一端傳遞給子進程之前執行此操作。