0

当 select 返回文件描述符已更改时,我如何仅从哪些套接字中读取数据?当 FD 更改时,ATM 会执行 printf 语句,即使该 FD 在缓冲区中没有数据也是如此。

编辑:我遇到的问题是阅读,尽管我没有发送任何数据。我正在使用 1 个套接字来发送接收。

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);

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]);
    }
}
}
4

1 回答 1

1
if (read(si->mastFD[i], buffer, MAXBUF) > 0)
        printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); 

这将在 3/4 的时间内打印垃圾。它应该是:

int count = read(si->mastFD[i], buffer, MAXBUF);
if (count >= 3)
    printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); 
else if (count == 2)
    printf("%d %d \n",buffer[0], buffer[1]); 
else if (count == 1)
    printf("%d \n",buffer[0]); 
else if (count == 0)
{
    printf("EOS on %d \n",si->mastFD[i]); 
    close(si->mastFD[i]);
}
else if (count < 0)
{
    printf("error on %d: %s \n",si->mastFD[i], strerr[errno]); 
    close(si->mastFD[i]);
}
于 2013-10-20T07:07:50.150 回答