我的服务器正在向客户端发送数据包,但未显示第二个数据包。
我不知道如果我的套接字是阻塞类型,为什么会发生这种情况。

     while(1){
             memset(buf,0,1024);
             numbytes=0;

             if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) {
                  perror("recv");
                  exit(1);
                 }
             buf[numbytes] = '\0';
             printf("%s\n",buf);
             fflush(stdout);
            }
  fclose(fp);
  close(sockfd);

最佳答案

发生这种情况是因为您的服务器发送了一个空字符串。因此,您的客户端不会阻塞,因为它收到了'\0'字符,并且由于它是一个空字符串而不会打印任何内容。

第二个原因可能是因为您的服务器关闭了连接。在这种情况下,numbytes的值为零,并且您的客户端将不打印任何内容,因为您最终在缓冲区中还带有一个空字符串。

代码的一个问题是,如果服务器发送1024个字节或更多,则numbytes等于1024,如果缓冲区大小也等于1024,则表达式buf[numbytes]会引起分段错误。通过接收1023而不是1024来解决此问题。

09-25 22:08