簡體   English   中英

在套接字上發送結構

[英]Sending a structure over a socket

我正在嘗試實現一個程序,通過c ++套接字從客戶端向服務器發送結構。

到目前為止,我在自己的計算機上工作正常(服務器和客戶端都在我自己的計算機上),但我懷疑在不同的計算機上運行服務器和客戶端時可能會遇到麻煩。

到目前為止我所擁有的是:

struct myStruct
{
    int whatever;
};

//Sender

myStruct obj;
obj.whatever = 123;
char *byteStream = (char *) &obj;

write(socketFD, byteStream, sizeof(myStruct));

//Receiver

char *byteStream = new char[sizeof(myStruct)];
read(socketFD, byteStream, sizeof(myStruct));

myStruct *received = (myStruct *) byteStream;
cout<<received->whatever;

接收器上的cout聲明打印123。

只要字節順序相同(例如,兩者都是PC),這應該在不同的計算機上工作。

不同的系統可以使用不同的字節順序結構填充 你需要確保你的結構兩側都有包裝 通常應該始終按網絡順序(big endian)發送多字節整數。 使用ntohl和朋友在字節順序之間轉換。

這很好,現在只要字節順序結構的包裝將被保留(一旦你在你的不止一個數據成員struct ), 但是 ,使用sizeof(myStruct)會給你的問題,當你在你的結構數據成員分配堆內存。

我不會從一開始就依賴sizeof 構建一個函數來獲取數據大小並使用它。

你應該認真考慮某種序列化庫。 JSON非常流行且非常容易調試,因為它本質上是文本格式。 Google protocol buffers效率更高,但需要更多努力才能使其正常工作。 還有像Thrift這樣的其他類似的庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM