2012-02-02 142 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

相關問題