2016-07-19 89 views
-1

發送結構我嘗試通過TCP發送和接收數據。我的問題是我想在一個TCP消息中發送2個結構體,有沒有什麼辦法將結構鏈接在一起。 喜歡的東西:C++,通過TCP

send(connected, struct1 + struct2, sizeof(struct1 + struct2), 0); 

recv_data = recv(connected, struct1 + struct2,sizeof(struct1 + struct2),0); 

如果不是有可能在消息像開頭添加一個信號字節:

send(connected, "0x01" + struct1, sizeof(struct1 + 1), 0); 

recv_data = recv(connected, struct1,sizeof(struct1),0); 
+0

看到的std ::矢量::數據 –

+1

不,不,不,不。 'sizeof(vector)'不會告訴你矢量內容佔用了多少字節。停止你在做什麼,並考慮一下。 –

+0

對不起,我錯過了一些東西,我正在談論結構。編輯帖子。 – tascapone

回答

0

你可以看着writevreadv功能,它允許用多個不連續的存儲器位置發送/接收數據。

struct iovec data[2]; 
data[0].iov_base = vector1.data(); 
data[0].iov_len = vector1.length() * sizeof(vector1[0]); 
data[1].iov_base = vector2.data(); 
data[1].iov_len = vector2.length() * sizeof(vector2[0]); 
writev(socket, data, 2); 

但是在接收端,您需要一些方法來知道傳入元素的數量,以便您可以保留足夠的空間來讀入。

這也將只平凡的,可複製的對象,而不是像std::vector<std::string>的載體工作。

你真的需要定義某種適當設計的序列化格式,而不僅僅是載體複製原始字節到插座。

如果你不知道如何做到這一點正確的(和你的僞代碼建議你不這樣做),然後看像Protocol Buffers代替。

編輯:好的,你不是在談論媒介,儘管反覆地說「媒介」。對於瑣碎類型的簡單結構,你可以做到這一點:

struct iovec data[2]; 
data[0].iov_base = &struct1; 
data[0].iov_len = sizeof(struct1); 
data[1].iov_base = &struct2; 
data[1].iov_len = sizeof(struct2); 
writev(socket, data, 2); 

但你仍然不應該僅僅從插座複製原始字節/。這隻有在發送和接收機器同意數據類型的大小,對齊和字節順序時纔有效。使用像Protocol Buffers這樣的設計合理的序列化系統更安全更正確。這是由懂得如何正確和安全地做這些事情的人設計的。

+0

對不起,我錯過了什麼,我正在談論結構。編輯帖子。 – tascapone

+0

這個方法我可以發送數據,但是在接收端我收到錯誤的數據。 – tascapone

+0

**因此,請使用正確設計的序列化格式!否則,您會對對象佈局有各種不安全的假設。 –