2010-08-31 41 views
2

我創建結構的使用結構的sendto():如何發送

struct buffer 
{ 
    string ProjectName ; 
    string ProjectID ; 
} 

buffer buf; 
buf.ProjectID = "212"; 
buf.ProjectName = "MyProj"; 

現在使用sendto方法將這個結構,我類型轉換的strucure並把它發回如下:

char *sendbuf = (char*)&buf; 
sentbytes = sendto(sock,sendbuf,strlen(sendbuf),0,(sockaddr*)&their_addr,sizeof(their_addr)); 

但是,當我投擲我的結構ti char*實際的數據是失去它的值,而在調試時,我看到sendbuf包含一些其他值。

有人可以讓我知道如何使用sendto發送上述結構。

回答

2

您需要使用POD創建結構,該字符串不是您可以使用的方式。相反,你需要聲明它像

struct buffer 
{ 
    char ProjectName[MAX_LENGTH_PROJECT_NAME+1]; 
    char ProjectID[MAX_LENGTH_PROJECT_ID+1]; 
}; 

做一些修改:澄清,該字符串包含一個指向堆分配的內存塊,這樣你就不會實際發送的字符,當您嘗試發送結構。

2

std::string將其數據保存在動態分配的內存中。您可以分別發送每個字符串和一個字符串的長度,您可以使用std::string::c_strstd::string::size

1

當通過網絡發送數據時,首選使用marshall/unmarshall。 C++風格是使用「< </>>」來流式傳輸到可發送緩衝區。這樣,您就可以更好地控制您發送的內容以及發送方式(二進制,文本,xml,...)。 Boost也有一個serialization module