2012-12-25 71 views
2

對於非阻塞式網絡插座,connect()是否可以返回0?可以連接()返回0與非阻塞套接字?

頁面只是說 它將返回-1並設置errno爲EINPROGRESS,如果「插座是無阻塞的連接無法立即完成」。

「立即」究竟意味着什麼?

如果connect() CAN在這種情況下返回0,那麼在什麼情況下它會返回0表示成功?當客戶端和服務器之間的網絡非常好時?要麼?

回答

1

在這種情況下,「立即」意味着無需等待通過網絡從另一臺機器接收數據。如果它可以立即完成,則可以返回零。例如,如果它連接到同一臺機器上的另一個進程,則內核可以立即完成連接過程。

+0

謝謝你的答覆,但似乎也許我沒有得到你的觀點。如果同一臺計算機上的另一個進程忙於其他事情會怎麼樣? Connect()不會返回0嗎?那麼可能會有一個超時?其實我問的是真實網絡存在的情況。 – Jacky

+1

如果數據包必須通過真實網絡發送,則操作系統不會等待回覆。實質上,設置套接字非阻塞意味着永遠不會等待從遠程機器接收數據包。如果操作系統可以在不等待的情況下成功完成「connect」調用,那麼它將返回0.通常情況下發生的唯一情況是,如果您要連接到同一臺機器上的另一個進程。 –

1

connect(2)是一個系統調用,即進入內核。這是一個多任務操作系統搶先進行其他事情的機會。

現在,假設您詢問TCP,即使對於非阻塞套接字,也不一定要這樣做,但可以實現connect(2),以便在條目上啓動協議握手,並且在返回到用戶空間之前檢查if它是完整的。然後,由於OS網絡堆棧對用戶應用程序的操作大多數是異步的,因此如果您的進程在系統調用過程中被搶佔並稍後切換回來,握手可能已經完成,並且成功返回到零應用程序。

+0

謝謝,這很有道理。 – Jacky

+0

那麼它就是這樣實現的。 – EJP

2

是的,非阻塞connect()可以返回0(表示成功),儘管TCP不可能發生這種情況。 「立即」意味着內核不必等待確定狀態。情況下,您可以看到這包括

  1. UDP套接字,其中連接()基本上是諮詢,讓send()方法,以供以後使用,而不是SENDTO()。

  2. 流式UNIX域套接字,其中對等體位於相同的內核中,因此可以立即進行仔細檢查。

  3. 到127.0.0.1(本地主機)的TCP連接。