2013-02-23 31 views
0

下面我從我的服務器代碼和客戶端代碼中有一段代碼。我的客戶端向成功接收的服務器發送一個整數,然後向服務器發送一個長度爲str_len的字符串。服務器中的第二次讀取不起作用,它阻塞並且沒有讀取任何內容。當我退出客戶端時,服務器打印它沒有讀取任何東西。哪裏不對?兩次連續的套接字讀取,二次讀取不起作用

  //Server code 

      bzero(buffer,256); 
      n = read(newsockfd,buffer,255); 
      if (n < 0) error("ERROR reading from socket"); 
      unsigned int *length = new unsigned int; 
      memcpy(length, buffer, sizeof(int)); 
      cout << "Length : " << *length << endl; 
      int len = *length + 1; 
      char buffIn[len+1]; 
      bzero(buffIn,len); 
      //ok msg? 
      n = read(newsockfd,buffIn,len); 
      if (n < 0) error("ERROR reading from socket"); 
      cout << "value of n" << n << endl; 
      printf("Received : %s\n", buffIn); 


      //client method 

      void send(string req) 
      { 
       //Send string len 
       unsigned int str_len = req.length(); 
       //str_len = 3000; 
       write(socketFd, &str_len, sizeof(str_len)); 
       //Send string 
       const char *str_req = req.c_str(); 
       printf("%s\n",str_req); 
       cout << "Str len is : " << strlen(str_req) << endl; 
       write(socketFd, str_req, strlen(str_req) + 1); 
       cout << "write done " << endl; 
      } 
+0

你有沒有檢查第一次讀了多少字節接收?這兩個發送命令的數據很有可能在一個包中發送和接收,因此在第一次讀取之後已經交給應用程序。 – junix 2013-02-24 00:08:44

+1

你讀取的字符串長度爲從套接字讀取255個字節,因此拉入數據的前251個(假設爲32位整數)。所以當你詢問字符串的其餘部分時,你會要求額外的251個字節,它們不會被髮送,因此讀取的調用塊 – Dampsquid 2013-02-24 00:09:51

+1

只是使用「unsigned int length; n = read(newsockfd,&length,sizeof(length)); 「 – Dampsquid 2013-02-24 00:15:00

回答

0

您讀取的字符串長度爲從套接字讀取255個字節,因此拉入數據的前251個(假設爲32位整數)。所以當你詢問字符串的其餘部分時,你會要求額外發送251個字節,這些字節不會被髮送,因此讀取的調用塊會被阻止。

讀取長度爲整數

unsigned int length; 
n=read(newsockfd,&length, sizeof(length)); 

在您的當前代碼段的delete一個不長度

unsigned int *length = new unsigned int; 

,這將導致一個小的內存泄漏。

正如羅布指出在他的答案,你應該檢查字節返回讀取數量,不只是檢查返回的錯誤

5

考慮這條線:

n = read(newsockfd,buffer,255); 

你永遠隨後檢查n的精確值。您檢查功能是否失敗,但您不檢查看有多少字節被讀取。提示:在你的情況下,它超過sizeof (int)

試試這個:

n = read(newsockfd, buffer, sizeof(int)); 

N.b:在其他情況下,它也可能是小於sizeof(int)。你也必須處理這種情況。

+2

關於讀取字節的非常好的說明可能少於請求的字節 – Dampsquid 2013-02-24 00:27:03