首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择C,为什么失败?

选择C,为什么失败?
EN

Stack Overflow用户
提问于 2013-05-21 16:17:58
回答 1查看 2.6K关注 0票数 1

我正在使用选择(2)函数检查C中的代码。在这段代码中,select函数应该返回一个与0不同的数字,当两个套接字中的任意一个准备就绪时。然而,即使套接字是在select之前声明的,并且当我在netstat --听我的时候,我得到其中一个套接字(cmd_socket)正在监听它指定的端口,它仍然找不到任何文件描述符。我尝试过强制执行不同的超时,我认为FD_SETSIZE是可以的,因为这段代码以前可以在另一台机器上工作。有什么问题吗?这是代码:

代码语言:javascript
复制
 // 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))  { 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-21 16:25:07

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16674764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档