服务器TCP卡在read()上

时间:2017-10-11 17:04:53

标签: c sockets tcp

我试图让服务器从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 个答案:

答案 0 :(得分:2)

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

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

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

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

虽然由于read() 阻止而导致连接关闭之前无法返回数据。

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

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