2012-11-25 43 views
11

私は信頼できるUDPプロトコルを実装するためにcソケットを使用しています。私は確認応答を待っているソケットでタイムアウトを設定するために次のコードを使用しています。なぜ私はerrno 11、リソースが一時的に利用できなくなっているのかわかりません。Errno:11、Resource一時的に利用できません

また、コメントに記載されている選択方法も試しました。私はループの中に以下のコードを持っていますが、recvfromは決してタイムアウトしません。

 fd_set set; 
     FD_ZERO(&set);  /* empties the set */ 
     FD_CLR(rcv_sock,&set); /* removes FD from the set */ 
     FD_SET(rcv_sock,&set); /* adds FD to the set */ 

     if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){ 
      printf("\nError Reporting: %d : %s\n\n", errno, strerror(errno)); 
      return -1; 
     } 


     if(!FD_ISSET(rcv_sock,&set)){ /* true if FD is in the set */ 
      printf("socket is not set properly.\n"); 
     } 
+0

代わりにselect()とnon-blockingソケットを使用してみてください。 select()のアプローチははるかに柔軟で信頼性が高く移植性があります。 –

+0

2番目のスニペットで 'recvfrom()' intを呼び出すことはありません。 – alk

+0

'recvfrom()'は 'int'ではなく' ssize_t'を返します。 – alk

答えて

13

ブロッキングソケット上recvfrom()を呼び出し、タイムアウトがsetsockopt()を使用して設定されていたとき、場合にrecvfrom()回の呼び出しをエラーEAGAIN (11)を出すようにするのが普通です(つまり:データを時間内に受信されませんでした期間はタイムアウトとして指定されます)。 man recvfromから

逐語:

返り値

...

エラー

... 。

EAGAINまたはEWOULDBLOCK ソケットがノンブロッキングマークされ、受信動作をブロックする、または受信タイムアウトが設定されていたとのデータがを受けた前 タイムアウトが満了しました。 ...

これを回避するには:ちょうど...再び私のために;-)

+1

恐ろしい答え!ありがとうございました! – rharrison33

0

recvfrom()を呼び出して、問題が特定のポートにバインドされたUDPソケットに到着したIPv6パケットによるものでした。これらはselect()をトリガーしていましたが、recvfrom()を使用してそれらを読み取ろうとしたときに、呼び出しは「Resource temporarily unavailable」を返しました。私は自分のアプリケーションにIPV6は必要ないので、単にsysctl.confで無効にします。問題は今すぐ消えた!

関連する問題