在同一解决方案中的两个项目之间实时通过 TCP 套接字流式传输 C++ 结构数据的最佳方法是什么?
What is the best way for streaming C++ struct data through TCP socket in Real-time between two projects in the same solution?
基本上我有一个结构:
typedef struct MyStruct1 {
vector<MyStruct2> data;
chrono::high_resolution_clock::time_point time_stamp;
} MyStruct1;
MyStruct2
是一个包含一些opencv数据的结构,例如:Point2f
。我想通过 TCP 套接字在同一个 VS 解决方案中的两个项目之间共享这个(因为我需要可靠的连接)。我也尝试过共享内存,但发现这不是共享复杂数据结构的好方法,而是用于 POD。但是每次我在客户端(接收数据的项目)中取消引用指向 MyStruct1
的指针时,我的程序都会崩溃。有什么解决办法吗?或者我应该尝试其他方式(那会是什么方式)?
我使用的代码在这里:server and client(注意:我没有使用 argv 和 argc,但其他一切都是一样的)。
提前致谢。
TCP 提供字节流。要通过 TCP 发送某些内容,您需要将其序列化为字节流。您不能只通过 TCP 连接写入 MyStruct1
对象。这永远不会正常工作,因为对象在内存中的内部表示将包含仅在进程内部有意义的数据,而这对另一个进程没有任何意义。
另一个要记住的问题:该向量中可能有一个条目。可能有一千个。接收方如何知道要读取多少字节或知道对象在哪里结束?
有很多用于序列化和反序列化的库和工具。
只要它在同一台机器上并在同一时间编译,所有设置都相同,并且数据 class 在两者上共享,您就可以定义一个朋友 operator<<
和 operator>>
每种类型,将被发送。
完全未经测试的不完整代码
ostream& operator<<(ostream& os, const MyStruct1 & dt) {
os << dt.time_stamp << dt.data.size(); // time_stamp might need more magic
for(auto& val : dt.data) // the MyStruct2 must also have an <<
os << val;
return os;
}
将其写入strstream并将字符串发送到另一端,使用>>
对其进行解码。
基本上我有一个结构:
typedef struct MyStruct1 {
vector<MyStruct2> data;
chrono::high_resolution_clock::time_point time_stamp;
} MyStruct1;
MyStruct2
是一个包含一些opencv数据的结构,例如:Point2f
。我想通过 TCP 套接字在同一个 VS 解决方案中的两个项目之间共享这个(因为我需要可靠的连接)。我也尝试过共享内存,但发现这不是共享复杂数据结构的好方法,而是用于 POD。但是每次我在客户端(接收数据的项目)中取消引用指向 MyStruct1
的指针时,我的程序都会崩溃。有什么解决办法吗?或者我应该尝试其他方式(那会是什么方式)?
我使用的代码在这里:server and client(注意:我没有使用 argv 和 argc,但其他一切都是一样的)。
提前致谢。
TCP 提供字节流。要通过 TCP 发送某些内容,您需要将其序列化为字节流。您不能只通过 TCP 连接写入 MyStruct1
对象。这永远不会正常工作,因为对象在内存中的内部表示将包含仅在进程内部有意义的数据,而这对另一个进程没有任何意义。
另一个要记住的问题:该向量中可能有一个条目。可能有一千个。接收方如何知道要读取多少字节或知道对象在哪里结束?
有很多用于序列化和反序列化的库和工具。
只要它在同一台机器上并在同一时间编译,所有设置都相同,并且数据 class 在两者上共享,您就可以定义一个朋友 operator<<
和 operator>>
每种类型,将被发送。
完全未经测试的不完整代码
ostream& operator<<(ostream& os, const MyStruct1 & dt) {
os << dt.time_stamp << dt.data.size(); // time_stamp might need more magic
for(auto& val : dt.data) // the MyStruct2 must also have an <<
os << val;
return os;
}
将其写入strstream并将字符串发送到另一端,使用>>
对其进行解码。