2010-03-04 32 views
7

我很新的編程和ESP網絡編程,所以如果它是愚蠢的,請不要太苛刻,謝謝。UDP和套接字,recvfrom()返回-1和資源暫時不可用

我有客戶端和服務器通信與圖表(UDP)在客戶端發送5個信息和收到消息後,服務器發回消息。接收和發送消息非常好,直到客戶端完成接收消息。在服務器發回所有消息後,它使用close()終止。所以客戶端的recvfrom()應該返回0,對吧?

假設recvfrom()從服務器端返回close()時應返回0,它將返回-1,而錯誤Resource暫時不可用。這是資源引用從服務器封閉的套接字?還是像其他完全不同的東西,比如用完緩衝區或其他東西(我認爲這不是真的)?

,並假設我的假設是錯誤的,則返回-1,因爲服務器端,我也許應該處理與

if(SOMEMACRO) 
    do something 

的錯誤,但我如何找出SOMEMACRO是什麼?我打印出來的錯誤,但它說資源temp不可用和recvfrom()描述沒有提到不可靠的資源..?

btw這是一個非阻塞套接字,如果這有什麼區別,因爲我讀過如果設置了O_NONBLOCK並且沒有消息可用,它會將errno設置爲EAGAIN或EWOULDBLOCK。 O_NONBLOCK未設置,但MSG_DONTWAIT已設置。他們基本上是相同的東西,其中O_NONBLOCK是用於一般文件描述符,而MSG_DONTWAIT是套接字特定的?

我的大腦現在並不是那麼偉大,如果有人能夠啓發我並澄清我的困惑,我會深表感謝。謝謝!

回答

13

UDP是無狀態協議,不同於TCP是面向連接的。您的接收代碼將不知道發件人是否已關閉套接字,它只知道是否有數據等待讀取。根據該男子頁recvfrom的Linux上:

如果沒有可用的消息在插座,接收呼叫等待消息的到達,除非套接字非阻塞(請參閱fcntl(2)),在這種情況下,返回值-1並將外部變量errno設置爲EAGAIN。

這似乎是正在發生的事情對你

編輯:請注意,「資源暫時不可用」和EAGAIN是同樣的錯誤,一個僅僅是用戶友好的descption VS定義名稱。基本上它只是告訴你,你試圖從插座讀取,並沒有數據可讀

+1

所以,如果你使用UDP,recvfrom()會返回0嗎?因爲你永遠不知道對方是否執行了有序的關機? – 2010-03-04 14:02:13

+2

@Fantastic Fourier - UDP實際上可以發送一個只有IP和UDP頭但沒有數據有效載荷的數據報。這是完全合法的,並會看起來像一個0字節的讀取。 – Duck 2010-03-04 14:21:46

+0

@Fantastic Fourier - 嚴格來說,由於UDP中沒有「連接」,所以沒有任何關閉,有序或其他。 – Duck 2010-03-04 14:28:33

2

當你關閉了socket之後,它仍然會一直存在。通常大約兩分鐘左右。爲了避免這種情況,請使用SO_REUSEADDR套接字選項。

以下是您的一些參考。

http://msdn.microsoft.com/en-us/library/ms740476%28VS.85%29.aspx http://docs.hp.com/en/B2355-90136/ch03s01.html

這裏是一個例子,向下滾動以udp_listen功能:

http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9jb2Rhc2UuYy9zbGlycC0xLjAuMTYvd29yay9zbGlycC0xLjAuMTYvc3JjL3VkcC5j&lang=c&off=15730+15796+

相關問題