gpt4 book ai didi

sockets - 选择c : wfds is always turned on,导致 block

转载 作者:行者123 更新时间:2023-12-03 12:05:29 26 4
gpt4 key购买 nike

由于某些原因,即使没有任何内容发送,FD_ISSET始终为&wfds返回true。这是代码片段(客户端和服务器上都相同)。选择说wfds处于打开状态,客户端和服务器都遇到相同的问题。它不应该仅在我在键盘上键入消息并按Enter时才激活吗?

while (1) {
//trying select..
tv.tv_sec = 29;
tv.tv_usec = 500000;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(new_sockfd, &rfds);
FD_SET(new_sockfd, &wfds);

n = select(new_sockfd + 1, &rfds, &wfds, NULL, &tv);

if (n > 0) {
if (FD_ISSET(new_sockfd, &rfds)) {

while (1) {
if ((num = recv(new_sockfd, buffer, 10240, 0)) == -1) {
//fprintf(stderr,"Error in receiving message!!\n");
perror("recv");
exit(1);
} else if (num == 0) {
printf("Connection closed\n");
return 0;
}
buffer[num] = '\0';
printf("Message received: %s\n", buffer);
break;
}
}
//this always returns true on client and host
if (FD_ISSET(new_sockfd, &wfds)) {

while (1) {
fgets(buffer, MAXDATASIZE - 1, stdin);
if ((send(new_sockfd, buffer, strlen(buffer), 0)) == -1) {
fprintf(stderr, "Failure Sending Message\n");
close(new_sockfd);
exit(1);
} else {
printf("Message being sent: %s\n", buffer);
break;
}
}
}
}
}

最佳答案

您可能误解了writefds参数对select()的工作方式。

仅当您有要发送的内容时,才应在调用select()之前为文件描述符在writefds中设置标志。

然后,当套接字在套接字缓冲区中有足够的空间来接受要发送的数据时,select()会在writefds中设置左标志,然后返回。然后,您检查该标志,并意识到该套接字可用于发送,并且您还知道还有要发送的东西,因为最初是您自己在调用select()之前设置了标志。因此,您可以继续通过套接字发送数据。然后,如果您已经发送了所有数据,并且要发送的缓冲区为空,则当您下次调用select()时,可以清除writefds的标志。

关于sockets - 选择c : wfds is always turned on,导致 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19170208/

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