0

私はネットワーク プロジェクトに取り組んでおり、select() 関数 (FD_XXX を使用) が、準備ができていて fd_set 構造体に含まれているソケット ハンドルの総数を返すことは知っていますが、これらのソケット (SOCKET または INT として) を知っていますか? FOR LOOP-CHECK FD_ISSET でソケット リストを取得する唯一の方法があります。他にどのように?

4

1 に答える 1

2

select() の戻り値について他の人が言っていることにもかかわらず、私は多くのソケットを扱うときにこのように使用します。ソケットが 1 つしかない場合にすべてのリストを処理する必要がないことを保証するものではありません。最後のものですが、最初のものであればコードを節約できます。

int i;
int biggest=0;
fd_set sfds;
struct timeval timeout={0, 0};

FD_ZERO(&sfds);
for (i=0; i < NumberOfsockets; i++)
{
    FD_SET(SocktList[i], &sfds);
    if (SocktList[i] > biggest) biggest=SocktList[i];
}

timeout.tv_sec=30;
timeout.tv_usec=0;

// biggest is only necessary when dealing with Berkeley sockets,
// Visual Studio C++ (and others) ignore this parameter.
if ((nReady=select((biggest+1), &sfds, NULL, NULL, TimeOut)) > 0)
{
   for (i=0; i < NumerbsOfSocket && nReady > 0; i++)
   {
      if (FD_ISSET(SocketList[i], &sfds)) {
         // SocketList[i] got data to be read
         ... your code to process the socket when it's readable...
         nReady--;
      }
   }
}
于 2013-06-26T18:14:23.040 に答える