gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:19:59 25 4
gpt4 key购买 nike

Unix/C 问题在这里。

我有多个套接字,我正在尝试轮询以获取周期性数据。我不希望 select 无限期地等待,所以我有一个超时并且我在循环中运行。我发现一旦套接字准备好读取,它总是准备好读取。就像在没有从任何套接字读取数据时,我不能让 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, NULL)) == -1 ) {
fprintf( stderr, "Select Error\n" );
return FAILURE;
}
printf( "Number of ready descriptors: %d\n", 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 up\n", i );
}
else {
fprintf( stderr, "Recv Error %d\n", nbytes);
}
}
else {
printf( "Data Received on %d: %s\n", i, buf );
}
}
} // end file descriptor loop

似乎在我第一次读取之后,1 秒超时不再适用并且套接字始终“准备好读取”,即使有 0 个字节可用。我怎样才能让 select 休眠直到数据进入(一秒钟,或者通过将最后一个参数切换为 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 集中删除套接字,否则 select 将报告它们(Socket 4 hung up).. select不是边缘触发,如果你不处理事件,它会再次报告。

关于c - 阻止来自多个套接字的 select(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574031/

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