對於非阻塞式網絡插座,connect()
是否可以返回0?可以連接()返回0與非阻塞套接字?
的人頁面只是說 它將返回-1並設置errno爲EINPROGRESS,如果「插座是無阻塞的連接無法立即完成」。
「立即」究竟意味着什麼?
如果connect()
CAN在這種情況下返回0,那麼在什麼情況下它會返回0表示成功?當客戶端和服務器之間的網絡非常好時?要麼?
對於非阻塞式網絡插座,connect()
是否可以返回0?可以連接()返回0與非阻塞套接字?
的人頁面只是說 它將返回-1並設置errno爲EINPROGRESS,如果「插座是無阻塞的連接無法立即完成」。
「立即」究竟意味着什麼?
如果connect()
CAN在這種情況下返回0,那麼在什麼情況下它會返回0表示成功?當客戶端和服務器之間的網絡非常好時?要麼?
在這種情況下,「立即」意味着無需等待通過網絡從另一臺機器接收數據。如果它可以立即完成,則可以返回零。例如,如果它連接到同一臺機器上的另一個進程,則內核可以立即完成連接過程。
是的,非阻塞connect()可以返回0(表示成功),儘管TCP不可能發生這種情況。 「立即」意味着內核不必等待確定狀態。情況下,您可以看到這包括
UDP套接字,其中連接()基本上是諮詢,讓send()方法,以供以後使用,而不是SENDTO()。
流式UNIX域套接字,其中對等體位於相同的內核中,因此可以立即進行仔細檢查。
到127.0.0.1(本地主機)的TCP連接。
謝謝你的答覆,但似乎也許我沒有得到你的觀點。如果同一臺計算機上的另一個進程忙於其他事情會怎麼樣? Connect()不會返回0嗎?那麼可能會有一個超時?其實我問的是真實網絡存在的情況。 – Jacky
如果數據包必須通過真實網絡發送,則操作系統不會等待回覆。實質上,設置套接字非阻塞意味着永遠不會等待從遠程機器接收數據包。如果操作系統可以在不等待的情況下成功完成「connect」調用,那麼它將返回0.通常情況下發生的唯一情況是,如果您要連接到同一臺機器上的另一個進程。 –