簡體   English   中英

UDP和套接字,recvfrom()返回-1,資源暫時不可用

[英]UDP and sockets, recvfrom() returning -1 and resource temporarily unavailable

我有一個客戶端和服務器與C中的數據報(UDP)通信。客戶端發送5個消息,並在收到消息后,服務器發回消息。 在客戶端完成接收消息之前,接收和發送消息是很好的。 服務器發回所有消息后,它將使用close()終止。 所以來自客戶端的recvfrom()應該返回0,對嗎?

假設recvfrom()應該在服務器端close()時返回0,它返回-1,而錯誤資源暫時不可用。 此資源是否是從服務器關閉套接字的引用? 或者它是否為完全不同的東西,比如用完緩沖區或其他東西(我不認為是真的)?

假設我的假設是錯誤的,並且因為服務器終止而返回-1,我可能應該處理錯誤

if(SOMEMACRO)
   do something 

我怎樣才能知道SOMEMACRO是什么? 我打印出錯誤,但它說資源臨時不可用,recvfrom()描述沒有提到無法使用的資源..?

順便說一句,這是一個非阻塞套接字,如果這有任何區別,因為我讀到如果設置O_NONBLOCK並且沒有可用的消息,它會將errno設置為EAGAIN或EWOULDBLOCK。 未設置O_NONBLOCK但設置了MSG_DONTWAIT。 它們基本上是相同的東西,其中O_NONBLOCK用於一般文件描述符,而MSG_DONTWAIT是特定於套接字的嗎?

我的大腦現在沒有那么好用,如果有人可以啟發我並澄清我的困惑,我會深深體會到這一點。 謝謝!

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

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

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

編輯:請注意,“資源暫時不可用”和EAGAIN是相同的錯誤,一個是用戶友好的描述與定義名稱。 基本上它只是告訴你,你正試圖從套接字讀取,沒有數據可讀

關閉套接字后,它仍然會持續一段時間。 通常大約兩分鍾左右。 要避免這種情況,請使用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+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM