繁体   English   中英

C中的套接字,具有select()方法的非阻塞send()和recv()

[英]Sockets in C, Non-blocking send() and recv() with select() method

我想用select()和FD_ISSET()制作一个非阻塞send()和recv()。 我遇到了这种行为,其中FD_ISSET()对于第一个套接字为true,而所有其他套接字始终未准备好。 我很困惑为什么会这样,我想知道我是否正确使用了select()。

如果我发送了100个请求,最终除了第一个套接字外,另一个套接字将准备好recv(),但是我没有得到这种行为。

  for(int i = 0; i < P - 1; i++) {
    sockArr[i] = GetSocket(server, port);
    if (sockArr[i] < 0) {
      // handle error
    }
    fcntl(sockArr[i], F_SETFL, O_NONBLOCK);
    if(sockArr[i] > maxfd) {
      maxfd = sockArr[i];
    }
  }

  fd_set sockSet;
  for(int i = 0; i < P - 1; i++) {
    numBytes = send(sockArr[i], request, requestLen, 0);
    if (numBytes < 0 || numBytes != requestLen) {
      // handle error
    }

    // read from other stackoverflow post you need to rest
    // per select() call
    FD_ZERO(&sockSet);
    for(int i = 0; i < P - 1; i++) {
      FD_SET(sockArr[i], &sockSet);
    }

    if(select(maxfd+1, &sockSet, NULL, NULL, NULL)) {
      for(int j = 0; j < i; j++) {
        if(FD_ISSET(sockArr[j], &sockSet)) { // <------ only true for j = 0
         numBytes = recv(sockArr[j], buffer, MAXBUFLEN - 1, 0);
          if (numBytes < 0) {
            // handle error
          }
        }
      }
    }
  }

您的第一个for循环需要在send()调用之后终止,然后应该启动另一个循环来处理选择和接收。

您需要检查recv()返回零以及-1,然后关闭套接字并将其从FD集中移除。

您还需要在j <= P循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM