2012-08-15 148 views
2

在C中,我正在閱讀一個頁面的html,但我希望持有數據的緩衝區是動態的。我知道我必須用循環和realloc來做到這一點,但我不太確定我會如何去做。假設我有我的插座(sock)已經打開考慮以下幾點:RECV動態內存分配

char *buffer = ???, *tmp; //just my guess I'm fairly certain buffer cannot be NULL considering my recv loop... 
int q = 0, c; 
int i = 1;  //buffer size 

    while(q < i) 
{ 
    c == recv(sock, buffer + q, i - q, 0); 
    if(c == SOCKET_ERROR) break; 
    i += c; 
    tmp = realloc(buffer, i * sizeof(char)); 
    //if(!tmp) /*not important right now I can add error handling later*/; 
    buffer = tmp;  
    q += c; 
} 

這將是對如何實現我的目標,我最好的猜測,但我很懷疑這會工作,我只是需要一些有識之士或更正。

+0

您可以使用'MSG_PEEK'標誌參數來查看消息的實際大小,只需一次性分配,不需要'realloc'。 – Necrolis 2012-08-15 15:23:55

+0

不是有需要的,但你可以給我一些關於你如何做到這一點的示例代碼?並感謝您的回答。這與學校無關,與個人興趣相關。 – 2012-08-15 15:28:03

+0

@Necrolis:你能舉個例子來更新我的代碼嗎?我不知道這樣做。我缺少一些東西.'char緩衝區[128]; size = recv(sock,buffer,sizeof(buffer),MSG_PEEK);'sizeof(buffer)'總是小於或等於'size'。從不大於,對嗎? – Jack 2012-08-20 18:08:02

回答

4

一些不良的錯誤代碼:

c == recv(... 

==是一個比較,而不是分配,您將永遠得到任何01。然後:

tmp = realloc(buffer, i * sizeof(char)); 

sizeof(char)1定義,你必須對NULL檢查返回值。另外,給你的變量命名一些有意義的東西 - 以後會爲你節省很多痛苦。

現在,您正在嘗試執行諸如「後分配」之類的操作 - 讀入一個緩衝區,然後將其擴展到您剛剛獲得的大小 - 有點倒退。

簡單的解決方案(多箇中的一個):

  • 分配緩衝區的前期,
  • 在累積尺寸的環保持軌道讀入它(和由此的偏移量),
  • 如果用盡了緩衝區空間 - 重新分配到兩倍於前一個的大小,並繼續。

工作的時間TM最。如果對方不斷向你提供數據,你可能需要添加一些理智檢查,以免吞噬你所有的記憶。

希望這會有所幫助。

+0

對不起,我僅僅因爲昨天遇到的一個問題而在這裏標明瞭這一點,非常感謝您的幫助! – 2012-08-15 15:37:08