这里是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
}
答案 0 :(得分:1)
关于此处显示的代码,maxpl+2
是错误的,它应该是maxpl+1
,尽管使用maxpl+2
是无害的。
select
需要它的1.参数比你fd_set
中任何一个中最大的文件描述符的值大1。 - 因为这就是选择文档所说的必须。
答案 1 :(得分:0)
来自手册页:
nfds参数指定要测试的描述符范围。应在每组中检查第一个nfds描述符; 也就是说,应该检查描述符集中从零到nfds-1的描述符。
select的第一个参数应该是其中所有fds的最大值加上一个。