通过 tcp 发送 C# 类并在 C++ 上反序列化



我不是C++开发人员,我需要使用 C# 客户端通过 TCP 将数据发送到C++服务器。 我在C++上的母语课是这样的:

class mypack
{
public:
BYTE ptype;
BYTE pver;
BYTE prob;
mypack()
{
ptype = 0;
pver = 1;
prob = 8;
}
};

我不知道如何以二进制格式打包数据?你能帮我吗?我需要使用封送处理?

这个问题对我来说并不完全清楚,但我看到了三个连贯的部分:

如何确保对象打包在C++中?

标准::对齐

如果您的编译器支持它,请使用 std::alignas。有些没有(想到GCC 4.8(。

__attribute__((包装((

使用 GCC,您可以使用特定于编译器的属性"packed"。

#pragma 包(1(

我不推荐这个,但如果你使用的是VC++或某些GCC版本,你可以使用编译指示来确保结构被打包。

使用序列化库

有很多。我听说过关于谷物的好事。

如何在C++中通过 TCP 发送对象?

假设您可以打开 TCP 套接字并建立 TCP 连接。然后,如果您在 POSIX 上,您可以使用 sendto。只要给它一个指向你的struct的指针,以及structsizeof(),你就可以开始了。

如何在C++中反序列化打包对象?

如果您对C++中的反序列化感兴趣,则需要 recvfrom。

如果您对 C# 中的序列化感兴趣,我会让更专业的人回答。

可能有几种方法可以做到这一点。我的做法是使用"boost"库来序列化C++对象。这允许创建成员数据流,即使它是一个指针。我用它创建了一个库(.dll(,并使用VC++.Net包装它以供C#使用。对于 C#,以下是结构

C++ <---> VC++.Net <---> C#

这允许客户端和服务器同时使用C++通用组件。

我使用BinaryWrited在套接字上写入:

using (var ms = new MemoryStream())
using (var bw = new BinaryWriter(ms))
{
//...
var buffer = ms.ToArray(); 
}

最新更新