通过TCP套接字

时间:2017-10-19 14:54:58

标签: c++ sockets tcp winsock

我的问题是将数据从C#发送到C ++,反之亦然。

我有一个"服务器"它正在等待"客户端"的TCP连接。对于服务器我使用的是C#/ .NET,而客户端是用C ++编写的,没有额外的库或依赖项(我希望保持这种方式)。

在服务器端,"消息"正被创建一个序列化为字节数组。消息必须以数据的长度开始(不包括长度本身)。接下来必须有一个ID来识别它的目的(1个字节),它可能有一些有效载荷,形式为" int"," double"," string"等

这就是C#-Message序列化的方式:https://pastebin.com/RM18HCk2

示例消息可能如下所示:

    [0]     0x11    byte < 4 bytes: Data length
    [1]     0x00    byte
    [2]     0x00    byte
    [3]     0x00    byte
    [4]     0x02    byte < 1 byte: Message ID (here: 2)
    [5]     0x03    byte < 4 bytes: Title length (here: "Abc")
    [6]     0x00    byte
    [7]     0x00    byte
    [8]     0x00    byte
    [9]     0x03    byte < 1 byte: EO
    [10]    0x41    byte < 3 bytes: Title (here: "Abc")
    [11]    0x62    byte
    [12]    0x63    byte
    [13]    0x03    byte < 4 bytes: Message length (here: "Def")
    [14]    0x00    byte
    [15]    0x00    byte
    [16]    0x00    byte
    [17]    0x03    byte < EOT
    [18]    0x44    byte < 3 bytes: Message ("Def")
    [19]    0x65    byte
    [20]    0x66    byte

现在我想在C ++端收回这些数据并解析它。我将收到的所有字节放入Buffer&#34; std :: deque MessageBuffer&#34;。这种情况一直持续到我有足够的时间来读取消息长度(int32的4个字节)。当我有预期的长度时,我会等到我已经足够接收完整的消息。

现在我需要解析&#34; MessageBuffer&#34;。我想根据第一个字节(即ID)调用不同的函数。根据消息,我知道数据的结构。在C#中,通过使用为我处理所有问题的BinaryReader解析它会非常简单。

问题:如何在没有boost或其他第三方库的情况下解析C ++中的MessageBuffer?

我想提取(在本例中)Title和Text,并将它们放在C ++端的std :: string中。但是,当然,相同的概念应该适用于所有类型的数据。

过去两天我在互联网上搜索过。出于某些原因,我可以找到的所有示例都是发送和接收std :: string,这根本不是我想要做的。 std :: istream会值得研究吗?

请注意,我不是在寻找解决方案,而是我会喜欢一些关于如何在C ++中完成的建议 - Land。

0 个答案:

没有答案