2013-01-17 46 views
47

什麼會導致套接字send()命令上的Resource temporarily unavailable錯誤?該插座設置爲AF_UNIX, SOCK_STREAM。它大部分時間都在使用,但偶爾會出現這個錯誤。插座的接收端似乎正常工作。什麼會導致sock send()命令中的「資源暫時不可用」

我知道這不是很詳細,但我只是在尋找一般的想法。謝謝!

+0

這是相關的嗎? http://stackoverflow.com/questions/5737493/sendto-resource-temporarily-unavailable-errno-11 – paddy

+2

你是否將套接字設置爲O_NONBLOCK? –

+0

我不認爲它與那篇文章有關。我的套接字是SOCK_STREAM,我相信這是我想要的。 – giroy

回答

59

"Resource temporarily unavailable"是對應於EAGAIN的錯誤消息,這意味着該操作將被阻止但請求非阻塞操作。對於send(),這可能是由於任何的:

  • 明確標記文件描述符與fcntl()阻塞;或
  • MSG_DONTWAIT標誌傳遞給send();或
  • 使用SO_SNDTIMEO套接字選項設置發送超時。
+0

我的問題的原因是設置發送超時。謝謝你的幫助! – giroy

+0

@caf,在我的情況下,兩端的不同MTU大小配置導致sctp關聯Txqueue在高速數據包交換髮生時被溢出。 使兩個系統上的MTU相同使問題消失。 但是誰能解釋一下這個問題背後的原因? –

30

這是因爲您使用的是non-blocking套接字並且輸出緩衝區已滿。

send()手冊頁

When the message does not fit into the send buffer of the socket, 
    send() normally blocks, unless the socket has been placed in non-block- 
    ing I/O mode. In non-blocking mode it would return EAGAIN in this 
    case. 

EAGAIN是錯誤代碼綁「資源暫時不可用」

考慮使用select()得到更好的控制,這種行爲

+0

這個答案也很有幫助。謝謝! – giroy

相關問題