7

acceptソケットをノンブロッキングに設定せずに関数を使用してクライアントを受け入れるためのタイムアウトクロスプラットフォームソリューションはありますか?

関数を使用する必要があることはわかっていselectますが、何が間違っていますか?

SOCKET NativesAcceptClient(SOCKET s, int timeout)
{
   int iResult;
   struct timeval tv;
   fd_set rfds;
   FD_ZERO(&rfds);
   FD_SET(s, &rfds);

   tv.tv_sec = (long)timeout;
   tv.tv_usec = 0;

   iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
   if(iResult > 0)
   {
      return accept(s, NULL, NULL);
   }
   else
   {
     //always here, even if i connect from another application
   }
   return 0;
}

それを修正する方法は?ありがとう!

4

3 に答える 3

1

select()ソケットがシグナル状態の場合は >0、タイムアウトの場合は 0、エラーの場合は -1 を返します。select()実際にあなたに戻ってくる価値は何ですか?>0 と <=0 のみをチェックしています。つまり、-1 と 0 を区別していません。0 を返している場合は、ソケットに接続しているクライアントはありませんが、-1 を返している場合は、ソケットが問題である可能性があります。そもそも有効ではありません。

于 2012-12-26T20:59:44.077 に答える
1

select() の最初の引数は、いずれかのビットセットのファイル記述子の最大値より少なくとも 1大きいint です。この場合

iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);

動作するはずです。

于 2012-12-26T19:29:45.353 に答える