2013-03-08 98 views
0

我遇到了字節數組的問題。 我正在創建文件傳輸程序,它通過TCP套接字傳輸二進制數據。 因此,當我從塊中獲取數據時,我將它們保存到臨時容器,然後我必須添加某處以保存整個數據。我已經試過的std ::矢量,但不能很好地工作(或我使用它錯了。)C++字節數組的字符

size_t nbytes = 0; 
char buffer[5]; //temporary container. 
int result = 0; 
std::vector<char> abc; 

if (ioctl(sockfd, FIONREAD, (char*)&nbytes) < 0) 
{ 
    printf("[-] Error getting available data.\n"); 
    return -1; 
} 
printf("[*] Bytes available: %lu\n", nbytes); 

while(true) 
{ 
    if(nbytes > sizeof(buffer)) 
    { 
     result = recv(sockfd, buffer, sizeof(buffer), 0); 
     for(int i = 0; i < result; i++) 
     { 
      abc.push_back(buffer[i]); //big data causes memory corruption. 
     } 
     nbytes -= result; 
     continue; 
    } 
    else if(nbytes <= sizeof(buffer) && nbytes != 0) 
    { 
     result = recv(sockfd, buffer, nbytes, 0); 
     for(int i = 0; i < result; i++) 
     { 
      abc.push_back(buffer[i]); //big data causes memory corruption. 
     } 
     break; 
    } 
    else 
    { 
     result = 0; 
     break; 
    } 
} 

printf("Data Received: %s", &abc[0]); 
+1

是否有其他人也被「字節數組」徹底混淆了,還是隻有我自己。 – 2013-03-08 12:46:06

+0

我已經習慣了:) – 2013-03-08 12:48:16

+0

我不明白的是使用(非常小)的C風格的數組作爲緩衝區。爲什麼不直接讀入'abc'? – 2013-03-08 12:49:36

回答

4

如果recv失敗則返回SOCKET_ERROR但你不檢查它,而是把它作爲數收到的字節。由於SOCKET_ERROR#define d到-1,您有效地從buffer之前的地址讀取。

編輯: 原來的答案是錯誤的,因爲在那種情況下,循環根本不會執行。 但是,問題是矢量的內容不是空終止的(因爲它是一個沒有任何字符串語義的普通緩衝區),所以它看起來像垃圾,但實際上它是確定的。

+0

這只是代碼的一小部分,錯過了錯誤檢查,但一切正常,但緩衝區仍在破壞。謝謝。 – Nika 2013-03-08 12:45:48

+0

好吧,很難分析與錯誤的代碼不同:) – 2013-03-08 12:47:31

+0

我在調試器下測試它,一切工作正常,我得到整個數據,但矢量緩衝區正在腐化..我的意思是,當我獲取數據並保存到那裏,它顯示我的數據+其他定義的字符。例如: char * abc =「1234」; 收到「AAAAAAAAAAA ...」 它打印出「AAAAAAAA ... 1234和一些隨機二進制字符:( – Nika 2013-03-08 12:49:45