gpt4 book ai didi

c++ - 通过 UDP 发送任何类型的数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:24 28 4
gpt4 key购买 nike

我试着到处搜索,但没有成功。这是我的问题:

我有一个 UDP 套接字,它可以通过任何端口将数据发送到任何 IP 地址(已测试并确认工作正常)。

看了很多教程,都是在操作char*[],并没有具体说明如何解密。

我想做什么(伪代码):

客户:

Class my_class;
send (..., my_class, sizeof(my_class),...)

服务器:

receive (sender, buffer, sizeof (buffer))
and do something like
Class my_class = (Class) buffer

所以我的服务器可以分析缓冲区的内容。

但是我迷失了指针,我只能发送char*[],所以我不知道如何来回转换。

最佳答案

您不能只是“发送”您的类(class)。您必须在您的类(class)中发送数据的表示。发送指向您类(class)的指针也不起作用。当网络上的另一个应用程序收到您的指针时,这对他们来说将毫无意义。

考虑一下:

class Data
{
std::string name_;
unsigned value_;
} data;

您不能只是通过网络“发送类(class)”。如果你试图做这样的事情:

send(&data, sizeof(data));

...你最终会向下游客户端发送废话。 value_ 可能会被正确接收,但 name_ 肯定不会。这是因为 std::string 对象不仅仅包含组成字符串的字符。还有计数器、指向数据缓冲区的指针,谁知道还有什么。字符本身可能甚至不会位于 (&data, &data[sizeof(data)]) 指示的内存空间中——这些字符将完全位于其他地方。因此,使用上面的 send 伪文档,您不仅会发送一堆客户无法理解的内容,而且通常您甚至不会发送他们可以理解的内容.

输入 serialization .序列化只是意味着创建一个可以存储、保存或发送到某个地方并在以后重新组合的数据对象的表示。您决定此序列化的形式。对于上面的 data,我们可能决定像这样序列化:

NNNNCCCCCCCC...VVVV

其中每个字符为 1 个字节,并且:

  1. N是一个4字符的整数,是ASCII表示的name_中的字符个数
  2. C为N个字节,每个字节为name_中的一个字符
  3. V为4位无符号整数,ASCII表示为value_中的值

上面序列化和发送数据的一种方法可能是这样的(警告:不是生产质量,未经测试):

stringstream ss;
ss
<< setw(4) << setfill('0') << right << data.name_.length() << setw(0)
<< data.name_
<< setw(4) << data.value_;

string buf = ss.str();

send(buf.c_str(), buf.length());

现在,我们不再尝试发送data,而是发送一个代表data 的字符串。如果 data 是这样创建的:

data.name_ = "foo";
data.value_ = 42;

...然后通过套接字发送的字符串将是:

0003foo0042

这可以由客户端接收并在客户端重新组装成一个新的 Data 对象,模仿您在服务器端拥有的内容。

我们上面使用的映射 -- NNNNCCCCCCCC...VVVV -- 双方都必须理解。这通常称为 communications protocol .

在所有应用程序领域中使用了无数的协议(protocol)和序列化方法。它们的范围从 super 简单的,如我上面概述的那个,到高度压缩和复杂的,如 FIX/FAST .许多库都提供序列化功能,以满足广泛的应用程序的需求。 Boost.Serialization想到了,我建议您考虑一下。

我在这里掩盖了更多内容。像 Endianness 这样的东西、安全、 session 控制...如果您要进行任何重要的网络编程,无论是在客户端还是服务器端,您都需要学习很多东西。

关于c++ - 通过 UDP 发送任何类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450901/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com