虽然c中没有数据,FD_ISSET会继续读取

我在监听多个套接字时遇到问题。 我有一个函数可以监听一堆套接字,但是当我测试并且只在1个套接字上发送数据时; 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 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上。