gpt4 book ai didi

c - FD_ISSET 继续读取,尽管 c 中没有数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:44 25 4
gpt4 key购买 nike

我在监听多个套接字时遇到问题。我有一个监听一堆套接字的函数,但是当我测试并且只在其中一个套接字上发送数据时; FD_ISSET 方法不断为每个套接字返回 true 并且没有数据返回到套接字的缓冲区中我也没有发送数据(因为没有)。我正在使用每个套接字进行发送和接收。我做错了什么?

编辑:发生的事情是 printf 语句打印多次,而它应该只打印一次,因为我只在 1 个套接字上发送数据。我已经添加了对 read()>0 的返回值的测试,但仍然没有任何乐趣。

void receive(struct nodeData *nd, struct sockInfo *si){
char buffer[MAXBUF];
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 1000;

// ----Wait in select until file descriptors change----
int y = select(si->maxFD, &si->fd_read_set, NULL, NULL, &timeout);
printf("ID: %d Y %d\n", nd->id, y);
if (y <= 0)
return;
for (int i=0; i < nd->netTopo->n; i++) {
/* ----Was it child i---- */
if (FD_ISSET(si->mastFD[i], &si->fd_read_set)) {
read(si->mastFD[i], buffer, MAXBUF);
printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); // For Testing
}
}
}

最佳答案

您忽略了 read 的返回值。 EOF 是一个可读条件(导致 select 将文件描述符报告为可读,即 FD_ISSET 返回 true),您需要通过 read 检测返回 0。在 EOF 之后,您可能想要关闭文件描述符并将其从集合中移除以打开 select

关于c - FD_ISSET 继续读取,尽管 c 中没有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19474000/

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