Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何仅读取已更改的文件描述符_C_Sockets - Fatal编程技术网

C 如何仅读取已更改的文件描述符

C 如何仅读取已更改的文件描述符,c,sockets,C,Sockets,当select返回filw描述符已更改时,如何仅从具有数据的套接字读取数据?ATM当FD更改时,即使FD在缓冲区中没有数据,也会执行printf语句 编辑:我遇到的问题是阅读一直在阅读,尽管我没有向下发送任何数据。我将1个插座用于发送和接收 void receive(struct nodeData *nd, struct sockInfo *si){ char buffer[MAXBUF]; struct timeval timeout; timeout.tv_sec = 0; timeout.

当select返回filw描述符已更改时,如何仅从具有数据的套接字读取数据?ATM当FD更改时,即使FD在缓冲区中没有数据,也会执行printf语句

编辑:我遇到的问题是阅读一直在阅读,尽管我没有向下发送任何数据。我将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]);
    }
}
}
这将在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]);
}

如果read返回>0,则存在一些数据。你为什么认为没有数据?顺便说一句,您必须存储read返回的值,如果它小于3,那么您的代码正在读取垃圾。@Mat小于3?嗯?为了测试,我只在一个套接字上发送数据,print语句会打印多次,但如果有意义,它不会打印任何内容。@n.m.:Donatello正在访问缓冲区[2]。如果只读取1或2个字节,那就是读取垃圾。多纳泰罗:不,这一点都不清楚。请回答你的问题,以显示你正在做什么,包括你正在发送什么,以及一些示例输出
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]);
}