1

我正在使用select(2)函数查看 C 中的代码。在这段代码中,当一组两个套接字中的任何一个准备好时,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))  { 
4

1 回答 1

2

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

然后从零返回select(2)意味着超时过期。检查您是否真的有数据在线,使用tcpdump(1)wireshark

于 2013-05-21T16:25:07.280 回答