首页 文章

服务器TCP卡在read()上

提问于
浏览
2

我正在尝试让服务器从TCP中的客户端接收消息 . 问题是,一旦我关闭客户端的套接字,我只在服务器端收到消息 .

这是服务器端的读取功能:

char *read_socket(int fd){
      int bytesRcvd, aux;

      char *buffer=(char*)malloc(BUFFSIZE*sizeof(char));

      bytesRcvd=read(fd, buffer , BUFFSIZE);
      aux=bytesRcvd;

      while(bytesRcvd>0){
        if((bytesRcvd = read(fd, &buffer[aux], BUFFSIZE))<0){
          printf("read() failed!: %s\n", strerror(errno));
          exit(1);
        }

        aux+=bytesRcvd;

      }
    return &buffer[0];
}

我知道(通过printfs)它被卡在线上:

bytesRcvd = read(fd, &buffer[aux], BUFFSIZE)

任何帮助将不胜感激 .

1 回答

  • 2

    您的程序正在读取行中的数据:

    bytesRcvd = read(fd, &buffer[aux], BUFFSIZE)
    

    您的while循环接收客户端发送的数据 . 如果客户端没有要发送的数据,则将读取 block ,直到连接关闭,其中将读取 return 0 并且您将从while循环退出 .

    这就是您认为数据最终发送(连接关闭时)的原因 . 这是不对的,如果您打印在while循环中读取的数据,您将立即看到它们,而不是最终都看到它们 .

    虽然由于 read() blocking 而无法在连接关闭之前返回数据 .

    对于一个客户端,如果你没有最后获取数据的问题,你的程序似乎没问题(因为我说你可以在循环中打印它们)但想象有两个或更多客户端然后你首先要关闭连接客户端继续从第二个读取数据,依此类推 .

    一个解决方案(对于这两个问题)是使用 select() 系统调用,只有在有数据时才会继续读取 . (虽然使用 fork()select() 不安全 - 不保证子进程的父进程不会阻塞读()) .

相关问题