在C中选择,为什么会失败



我正在审查C代码与选择(2)函数。在这段代码中,当两个套接字中的任何一个准备就绪时,select函数应该返回一个不同于0的数字。然而,即使在选择之前声明了套接字,它也无法找到任何准备好的文件描述符,当我netstat—listen时,我得到其中一个套接字(cmd_socket)正在其指定的端口上侦听。我尝试过强制不同的超时,我认为FD_SETSIZE是可以的,因为这段代码曾经在另一台机器上工作。哪里出了问题?这是代码:

 // Program sockets intialization
int cmd_sock = create_and_bind_socket(cmd_port_property(0,GET) ,&src_addr);
mc_sock = create_and_bind_socket(mcast_port_property(0,GET), &mc_addr); 
join_multicast_group(mc_sock,mc_addr_str, &mc_req);

int recv_len = 0;
int childs = 0;
struct timeval tv;
struct timeval *ptv = &tv;
if (!timeout) {
  ptv = NULL;
} else {
  ptv->tv_sec = timeout;
  ptv->tv_usec = 0;
}
fd_set readfds, safe;
fdmax = mc_sock;
// Add multicast and unicast sockets to set
FD_ZERO(&readfds);
FD_SET(cmd_sock, &readfds);
FD_SET(mc_sock, &readfds);
safe = readfds;
// Wait until some socket on the set is ready to be read 
while(select (FD_SETSIZE,&readfds,NULL,NULL,ptv))  { 

实际上,select(2)的第一个参数是 the highest-numbered file descriptor in any of the three sets, plus 1 ,而不是FD_SETSIZE,这只是fd_set占用的字节数。

select(2)返回0表示超时。检查是否真的有数据在线路上,使用tcpdump(1)wireshark

相关内容

  • 没有找到相关文章

最新更新