[英]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.