2012-09-27 52 views
6

我正在將腳本中的套接字連接更改爲非阻塞連接。在教程中,我發現了以下幾行:使用非阻塞套接字連接C

x=fcntl(s,F_GETFL,0);    // Get socket flags 
fcntl(s,F_SETFL,x | O_NONBLOCK); // Add non-blocking flag 

所以我在創建套接字之後並在連接語句之前添加了它們。它不再阻止:)但它也沒有連接。我沒有收到任何錯誤,連接只是返回-1。如果我將這些線註釋掉,它就會連接。

我還需要添加什麼來獲得非阻塞連接才能連接?

回答

6

檢查返回值connect(2) - 您應該得到-1EINPROGRESSerrno(3)。然後將套接字文件描述符添加到輪詢集,然後用select(2)poll(2)等待它。

通過這種方式,您可以同時進行多個連接嘗試(例如瀏覽器如何操作)並能夠縮短超時時間。

4

connect可能會立即返回一個EINPROGRESS錯誤。閱讀使用select

請注意,您可能想包裝您的呼叫以選擇TEMP_FAILURE_RETRY宏。

+0

嗯,這裏有什麼意思?它與* blocking *'connect'有什麼不同? –

+0

@NikolaiNFetissov公平點,我編輯了我的答案,刪除代碼片段作爲潛在的誤導,並強調使用TEMP_FAILURE_RETRY – simonc