2011-11-26 122 views
3

Solaris中套接字錯誤EINPROGRESS的可能原因是什麼? 我們如何檢查根本原因?solaris中插座錯誤EINPROGRESS的可能原因是什麼?

TCP API是:連接

+1

它意味着你有一個異步的事情怎麼回事,它尚未。如果你想要建設性的答案,請指定你在說什麼系統調用。 – Mat

+0

我已經指出如何繼續添加手冊頁提取關於如何在此獲取更詳細的信息:http://stackoverflow.com/q/8277540/694576 – alk

+0

無論如何,向我們展示至少您的客戶的代碼肯定會幫助... – alk

回答

8

顯然你是使用非阻塞套接字,你需要使用select()poll()以確定何時可以寫(連接是寫的一種形式)的插座。當您希望將數據寫入連接的套接字時,情況也是如此;當你感覺喜歡它時,你不僅要寫和連接,還要讓套接字告訴你什麼時候可以做事,同時你還做了其他事情(異步套接字操作的想法)。

檢查您的聯機幫助有關可用錯誤代碼的絕對真理:

$ man connect 

[EINPROGRESS]套接字是非阻塞,連接無法立即完成。可以通過選擇用於寫入的套接字來選擇(2)以完成。

12

你有一個非阻塞的插座,你打電話給它connect()。由於connect()需要發生三次握手(所以是網絡往返),它會阻止在阻塞套接字中等待SYN-ACK,或者給您一些指示,說明它尚未在非阻塞套接字中成功。通常情況下,非阻塞套接字會返回EAGAIN/EWOULDBLOCK,告訴您它們無法進步,您應該再試一次:這不完全是您的情況,connect()返回EAGAIN/EWOULDBLOCK,因爲沒有免費的臨時端口來告訴您應該稍後再試;所以對於非阻塞連接還有一個錯誤:EINPROGRESS,它告訴你該操作正在進行,你應該稍後檢查它的狀態。

以後要檢查狀態,套接字將成爲準備好可寫,所以你可以使用select()/poll()/...測試爲,在這之後,你必須getsockopt(...SO_ERROR...)讓你連接的成功/失敗狀態()操作。

+0

現在我只在EAGAIN/EWOULDBLOCK中發生非阻塞錯誤,所以在非阻塞時,如果必須做EINPROGRESS錯誤和EAGAIN/EWOULDBLOCK錯誤一起選擇 – Syedsma

+1

@Syedsma:only connect( )返回EINPROGRESS。 – ninjalj

+0

只是想知道,如果選擇返回true(例如選擇寫),連接成功,但最後設置的errno是EINPROGRESS。在這種情況下應該忽略這個錯誤? – Bionix1441

-1

我試圖連接到一個無效的本地IP地址(即不正確的子網),當這個錯誤,糾正主機固定問題

相關問題