2012-02-02 145 views
0

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

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

你是什么意思*试图接收两次*?你能否澄清你的问题? – cnicutar 2012-02-02 09:10:28

+0

Wireshark是一个方便的工具,它可以帮助你在这种情况下 – stdcall 2012-02-02 09:13:15

+0

这意味着while循环迭代两次,第一次我得到的数据,我从服务器第二次发送它的唯一,空,但根据我应该阻止和等待数据来自服务器端。 – tod 2012-02-02 09:16:17

回答

1

这可能是因为您的服务器发送空字符串而发生的。因此,您的客户端不会因为它收到'\0'字符而被阻止,并且它不会打印任何内容,因为它是空字符串。

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

一个问题是,如果服务器发送1024个字节以上,numbytes被goign等于1024和表达buf[numbytes]会造成分段错误,如果你的缓冲区的大小也等于1024。你可以阻止这个问题通过接收1023而不是1024.

+0

或者他可以将数据视为字节,而不是字符串。他可以尝试'printf(“%。* s”,numbytes,buf)''或'fwrite(buf,1,numbytes,stdout)' – 2015-05-25 05:41:51

相关问题