2011-10-25 126 views
0

我想將收到的數據添加到需要在運行時可配置的緩衝區(我從文件或命令行讀取大小)。追加到動態分配的陣列

因此,基本上我確定我的buffersize並使用calloc分配一個內存區域(如果它不在配置文件或命令行中,我還要設置一個緩衝區大小 - 讓我們假設我們現在使用它)。

我只是把適用的代碼行。

int buffersize=10000; 
void *BuffPtr = (void *)calloc(1,buffersize * sizeof(char)); 

我然後具有從UDP一個recv(我試圖接收到字符數組和動態分配的陣列 - 這兩個工作精細)

// Setup socket...... 

void *PktBuff = (void *)calloc(1,1000 * sizeof(char)); 

// Loop and receive many packets...... 

rcvd_bytes=recv(recv_socket, PktBuff, 1000, 0); 

我能,在這一點,寫的PktBuff內容它工作正常。但我想在我的動態分配數組中連接多個收到的數據包(上面定義的BuffPtr)。

我試過了strcat,但是如果我嘗試寫入收到的第一個數據包,卻沒有獲得另一個數據包,我就會發生垃圾。

strcat(BuffPtr, PktBuff); 

我在做什麼錯?

在此先感謝。

+0

strcat依賴'\ 0'作爲字符串終止符。嘗試在strcat之後添加它。 – BigMike

+0

您正在執行calloc調用錯誤:第一個參數是要分配的項目數(第一個代碼塊中的「buffersize」),第二個參數是每個項目的大小。它應該是'calloc(buffersize,sizeof(char))'。 –

+0

@BigMike errr否......假設BuffPtr只包含非\ 0字節。 –

回答

3

您的數據似乎不是以0結尾的字符串,您可能想用memmove代替。

+0

也許它可以在999字節讀取到PktBuff?作爲calloc歸零內存。 –

+0

或分配1001字節。也就是說,如果我們假設數據中沒有零。 –

+0

邁克爾,我試過memove它的作品爲第一個實例,然後我得到垃圾的第二個和後續的數據包。 – ComputerBiker

2

幾個觀點和看法:

  1. 不要投的malloc()的返回值C.
  2. 表達sizeof (char)是寫1,乘以它是很少翔實的羅嗦方式。
  3. 確保所有的數據都是以0結尾的(字符串),否則你不能使用字符串函數,因爲這就是他們需要的。
  4. 您應該只需使用額外的size_t計數器來跟蹤BuffPtr中的字節數,然後使用它和memcpy()來追加。
+0

謝謝,我確實有BuffPtr中總字節數的計數器,並且根據Michael的建議,我使用了memove,它略微改善了一些事情。我必須錯過包裹上的終止字符串?會檢查。 – ComputerBiker

0

好的,你的代碼strcat中的許多問題不是追加二進制數據的正確方法。這是一個半穩健的實現。我沒有檢查過它的語法錯誤,只是輸入它,請研究它作爲一個例子,並將其調整到您的代碼。

/* total number of bytes you are willing to receive in single a single receive */ 
#define MAX_RECV_BUFFER 1000 

/* total number of bytes you are willing to store in memory */ 
#define MAXBYTES MAX_RECV_BUFFER*1000 

int append_bytes() { 
    char rcvbuf[MAX_RECV_BUFFER]; /* buffer where things are received */ 
    void *buf = NULL; /* buffer where bytes are collected */ 
    size_t rcvlen; /* length of data received */ 
    size_t buflen = 0; /* total bytes */ 

    while(1) { 
     void *p; 
     rcvlen = recv(recv_socket, rcvbuf, MAX_RECV_BUFFER, 0); 
     if (rcvlen < 0) { manage_error(); } 
     if (rcvlen == 0) 
       break; 
     if (buflen + rcvlen > MAXBYTES) 
       break; 
     p = realloc(buf, buflen+recvlen); 
     if (!p) { manage_memory_error(); } 
     buf = p; /* we have enough space */ 
     memcpy(buf+buflen, rcvbuf, recvlen); /* append new content to end of buffer */ 
     buflen+=recvlen; /* add length to buflen */ 
    }  
} 
+0

謝謝,但編譯器不喜歡memcpy。我已經完全按照你的方式聲明瞭事情(刪除我以前的calloc),並在memcpy中引用了buf + buflen參數的編譯器錯誤:expression必須是指向完整對象類型的指針?????? – ComputerBiker