使用select的tcp和udp echoclient服务器

时间:2013-03-03 11:35:07

标签: c++ sockets tcp network-programming udp

这里是tcp和udp echoclient服务器的代码片段,使用select.i完成了poll和 得到了一个很好的清晰度,但是当你选择它已经在书中描述时,即在下面的代码片段中我们应该采取(maxpl + 2)我没有得到它,首先我们为什么采取最大(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 
  }

2 个答案:

答案 0 :(得分:1)

关于此处显示的代码,maxpl+2是错误的,它应该是maxpl+1,尽管使用maxpl+2是无害的。

select需要它的1.参数比你fd_set中任何一个中最大的文件描述符的值大1。 - 因为这就是选择文档所说的必须。

答案 1 :(得分:0)

来自手册页:

nfds参数指定要测试的描述符范围。应在每组中检查第一个nfds描述符; 也就是说,应该检查描述符集中从零到nfds-1的描述符。

select的第一个参数应该是其中所有fds的最大值加上一个。