2013-01-17 66 views
47

ソケットsend()コマンドでResource temporarily unavailableエラーが発生する原因は何ですか?ソケットはAF_UNIX, SOCK_STREAMと設定されています。ほとんどの場合は動作しますが、時々このエラーが発生します。ソケットの受信側が正常に動作しているようです。ソケットのsend()コマンドで "Resource temporarily unavailable"を引き起こす原因

これはあまり詳しくはわかりませんが、私は一般的なアイデアを探しています。ありがとう!

+0

を行動のよりよい制御を取得するためにselect()の使用を検討してくださいこれは関連していますか? 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私の場合は、2つの側で異なるMTUサイズの設定が、パケット交換の発生率が高いときにsctp関連のTxqueueがオーバーフローする原因となりました。 両方のシステムでMTUを同じにすると、問題はなくなりました。 誰でも問題の背後にある理由は何ですか? –

30

これは、non-blockingソケットを使用しており、出力バッファがいっぱいだからです。 send() manページ

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から

は "一時的に利用できないリソース" に結びつけられたエラーコードです

これは

+0

この回答も非常に役に立ちました。ありがとう! – giroy

関連する問題