加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

阻止来自多个套接字的select()

发布时间:2020-12-16 03:35:34 所属栏目:百科 来源:网络整理
导读:Unix / C问题在这里. 我有多个套接字,我试图轮询周期性数据.我不希望select无限期地等待,所以我有一个超时,我正在循环运行.我发现一旦套接字准备好读取,它就可以随时读取.因为,当没有任何数据要从任何套接字读取时,我无法选择进入休眠状态. for (i = 0; i n_
Unix / C问题在这里.

我有多个套接字,我试图轮询周期性数据.我不希望select无限期地等待,所以我有一个超时,我正在循环运行.我发现一旦套接字准备好读取,它就可以随时读取.因为,当没有任何数据要从任何套接字读取时,我无法选择进入休眠状态.

for (i = 0; i < n_connections; i++) {
  FD_SET( sockfd[i],&master );
  if (sockfd[i] > fdmax) 
    fdmax = sockfd[i];
  }

for(;;) {
  int nready = 0;
  timeout.tv_sec  = 1;
  timeout.tv_usec = 0;
  read_fds = master;
  if ( (nready = select(fdmax+1,&read_fds,NULL,NULL)) == -1 ) {
    fprintf( stderr,"Select Errorn" );
    return FAILURE;
  }
  printf( "Number of ready descriptors: %dn",nready );

  for (i = 0; i <= fdmax; i++) {
    if (FD_ISSET(i,&read_fds)) {
      if (( nbytes = recv(i,buf,sizeof(buf),0)) <= 0 ) {
        if (nbytes == 0) {
          //connection closed
          printf("Socket %d hung upn",i );
        }
        else {
          fprintf( stderr,"Recv Error %dn",nbytes);
        }
      }
    else {
      printf( "Data Received on %d: %sn",i,buf );
    }
  }
} // end file descriptor loop

似乎在我第一次读取之后,1秒超时不再适用,并且套接字始终“准备好读取”,即使有0个字节可用.如何在数据进入之前选择进入休眠状态(一秒钟,或者将最终参数切换为NULL,无限期地等待数据进入套接字?)

输出:

Number of Ready Descriptors: 2
Data Received on 4: GreetingsChap
Data Received on 5: HiMatengsChap
Loop...
Number of Ready Descriptors: 2
Socket 4 hung up
Socket 5 hung up
Loop...
Number of Ready Descriptors: 2
Socket 4 hung up
Socket 5 hung up
Loop...

谢谢,

注意:为清晰起见,代码已更新
根据@yvesBraumes建议更新 – 仍然无法正常工作.

解决方法

如果您检测到连接已关闭,请从fd集中删除套接字,否则选择将报告它们(套接字4挂起)..选择不是边缘触发,如果您不处理该事件,它将会再次报告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读