2013-11-02 71 views
0

我有這樣的結構:結構的char *通過TCP

typedef struct pkt {  
    unsigned int  pktid; 
    unsigned int  pkt_leng; 
    unsigned int  strleng; 
    char*   str; 
}; 
在我的代碼

我這樣做:

mystring = someFunctionWhoReturnString(); 

pkt* mypkt = (pkt*) malloc(sizeof(pkt)); 

mypkt -> pkt     = htonl(C_MYPKT); 
mypkt -> pkt_leng    = htonl(sizeof(pkt)); 
mpykt -> strleng    = htonl(mystring.lengh()); 

mypkt -> str = (char*)malloc(mystring.length()); 
strcpy(mypkt -> str, mystring.c_str(), mystring.length()); 

在此之後,如果我檢查什麼存儲在mypkt-> STR ,那裏的字符串。

但是當我收到pkt時,我得到了一些垃圾(尺寸很好),假設得到char *(包中的其餘數據到達確定)。

有一些聰明的方法來完成這項任務,而不使用char []與靜態大小?

IM在VC工作++ 2010

+3

您不能通過網絡發送指針,並期望它們在接收端有效。你需要發送實際的字符串。 char [],而不是char *。 Fwiw,你不能可靠地發送一個結構或int。結構打包,字節順序和int中的位數也肯定會讓你陷入困境。 xml和protobuf受歡迎的原因。 –

+0

謝謝你,很清楚。 – jsilva

+1

不要使用結構作爲網絡協議。根據八位字節定義一個有線協議,然後編寫代碼發送和接收它。 – EJP

回答

2

實現該sizeof(pkt) == 12,三個整數和指針的大小。它不包括指針指向的數據的長度。你發送的是三個整數和發送機器上字符串的地址 - 當然,這個地址對接收機器來說完全沒有用處。

相反,您需要準備一個平面緩衝區,該緩衝區將有三個整數,緊接着是字符數據。

+0

你是對的,我看到它的問題在哪裏。謝謝! – jsilva