gpt4 book ai didi

c - C 中的套接字,带有 select() 方法的非阻塞 send() 和 receive()

转载 作者:行者123 更新时间:2023-11-30 17:04:48 25 4
gpt4 key购买 nike

我想用 select() 和 FD_ISSET() 创建一个非阻塞的 send() 和 receive() 。我遇到了这种行为,其中第一个套接字的 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 集中删除。

您还需要循环 while j <= P .

关于c - C 中的套接字,带有 select() 方法的非阻塞 send() 和 receive(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35568656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com