sock send()コマンドで「リソースが一時的に利用できなくなりました」の原因


85

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

これはあまり詳細ではないことは知っていますが、私は一般的なアイデアを探しています。ありがとう!


これは関係がありますか? stackoverflow.com/questions/5737493/…–
水田

4
ソケットをO_NONBLOCKに設定していますか?
Deepankar Bajpeyi 2013年

その投稿とは関係ないと思います。私のソケットはSOCK_STREAMで、これがブロックされていると思います。
giroy 2013年

3
ストリームがブロッキングであるか非ブロッキングであるかは、SOCK_STREAMであるかSOCK_DGRAMであるかとは無関係です。そこにある答えは適切です。
バーマー2013年

回答:


96

"Resource temporarily unavailable"はに対応するエラーメッセージですEAGAIN。これは、操作がブロックされたが、非ブロック操作が要求されたことを意味します。の場合send()、これは次のいずれかが原因である可能性があります。

  • ファイル記述子をfcntl();で非ブロッキングとして明示的にマークします。または
  • MSG_DONTWAITフラグをに渡すsend(); または
  • SO_SNDTIMEOソケットオプションを使用して送信タイムアウトを設定します。

私の問題の原因は、送信タイムアウトの設定でした。助けてくれてありがとう!
giroy 2013年

@caf、私の場合、両側で異なるMTUサイズ構成が原因で、高レートのパケット交換が発生しているときにsctpアソシエーションTxqueueがオーバーフローしていました。両方のシステムでMTUを同じにすると、問題は解決しました。しかし、誰かが問題の背後にある理由を説明できますか?
codename_DJ 2017年

46

これは、non-blockingソケットを使用していて、出力バッファーがいっぱいであるためです。

send()マニュアルページから

EAGAINは、「リソースが一時的に利用できません」に関連付けられたエラーコードです

select()この動作をより適切に制御するためにを使用することを検討してください


@giroy:しかし実際には正しくありません...実際にはブロッキングソケット、SO_SNDTIMEO
EML

かっこいいですが、他の接続を使用してDBでの同時読み取りを管理するにはどうすればよいですか?
MUYベルギー

10

例を挙げましょう:

  1. クライアントはサーバーに接続し、1秒ごとに1MBのデータをサーバーに送信します。

  2. サーバー側は接続を受け入れtcp send buffer、クライアントからの受信メッセージなしで20秒間スリープします。したがって、クライアント側のはいっぱいになります。

クライアント側のコード:

サーバー側のコード:

サーバー側を起動してから、クライアント側を起動します。

サーバー側は以下を出力する場合があります。

ここに画像の説明を入力してください

クライアント側は以下を出力する場合があります。

ここに画像の説明を入力してください

サーバー側がクライアントからデータを受信しないため、クライアント側tcp bufferがいっぱいになってもデータを送信しているため、Resource temporarily unavailableエラーが発生する可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.