0

select.i を使用した tcp および udp の echoclient サーバーのコード スニペットを次に示しますまず、なぜ max(tcp_sfd,udp_sfd) を取っているのでしょうか?

 fd_set fdvar; 
 FD_ZERO(&fdvar); 
 FD_SET(tcp_sfd,&fdvar); 
 FD_SET(udp_sfd,&fdvar); 
 int maxpl = max(tcp_sfd,udp_sfd); 
 cout << "Waiting for a client...\n";

 if(select(maxpl+2 ,&fdvar,NULL,NULL,NULL)==-1) 
 { 
      perror("error in select"); 
  } 
 if(FD_ISSET(udp_sfd,&fdvar)) 
 { 
      // UDP 
  } 
  else 
  { 
      //TCP 
  }
4

2 に答える 2

1

ここに示されているコードに関しては、maxpl+2間違っています。maxpl+1使用しても問題はありませんmaxpl+2

select1. 引数は、いずれかのファイル記述子の最大値よりも 1 大きい必要がありますfd_set。-それは、selectのドキュメントがそうでなければならないと言っているからです。

于 2013-03-03T11:49:19.983 に答える
0

マンページから:

nfds 引数は、テストする記述子の範囲を指定します。最初の nfds 記述子は、各セットでチェックされます。つまり、記述子セットの 0 から nfds-1 までの記述子が検査されます。

select の最初の引数は、その中のすべての fds の最大値に 1 を加えたものでなければなりません。

于 2013-03-03T13:56:19.600 に答える