通过 UDP 发送任何类型的数据
Send any type of data over UDP
我尝试到处搜索,但没有运气。这是我的问题:
我有一个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 Data
{
std::string name_;
unsigned value_;
} data;
你不能只是"发送班级"在电线下。 如果您尝试执行以下操作:
send(&data, sizeof(data));
。您最终会向下游客户端发送废话。 value_
可能会被正确接收,但name_
肯定不会。 这是因为 std::string
对象包含的不仅仅是构成字符串的字符。 还有计数器,指向数据缓冲区的指针,谁知道还有什么。 字符本身甚至可能不会出现在(&data, &data[sizeof(data)])
指示的内存空间中 - 这些字符将完全在其他地方。 因此,使用上面的send
psudocude,您不仅发送了一堆客户无法理解的内容,而且通常您甚至不会发送他们无法理解的内容。
输入序列化。 序列化只是意味着创建数据对象的表示形式,该表示形式可以存储、保存或发送到某个地方,并在以后重新组装。 您决定此序列化将采用什么形状。 在上述data
的情况下,我们可能会决定像这样序列化:
NNNNCCCCCCCC...VVVV
其中每个字符为 1 个字节,并且:
- N 是一个 4 个字符的整数,是 ASCII 表示形式中
name_
字符数 - C 是 N 个字节,每个字节都是一个字符
name_
- V 是一个 4 个字符的无符号整数,是 ASCII 表示形式中以
value_
表示的值
序列化和发送上述data
的一种方法可能是这样的(警告:不是生产质量,未经测试(:
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
- 必须被双方理解。 这通常称为通信协议。
所有应用程序域都使用了无数的协议和序列化方法。 它们的范围从超级简单,如我上面概述的,到高度压缩和复杂的,如FIX/FAST。 许多库提供序列化功能,可满足各种应用程序的需求。 Boost.Serialization浮现在脑海中,我建议你看看。
我在这里掩盖了更多内容。 诸如字节序,安全性,会话控制之类的东西... 如果你打算在客户端或服务器端进行任何重要的网络编程,你面前有很多学习。
你需要序列化你的类。这将转换为二进制表示形式,然后您可以将其放入char*[]
数据类型中并发送。char*[] 实际上只是保存要发送的字节,因此您需要将类转换为字节。当它到达另一端时,你需要反序列化它:将其从字节数组转换回对象。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何使用派生类类型数据初始化 std::shared_ptr?
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- C++ 包含针对多种类型数据的布尔测试的模板会获得匹配错误
- 如何将枚举类型数据保存到文件
- 防止谷物写入多态类型数据
- 如何在此程序中显示返回枚举类型数据的函数
- C++,捕获不同类型数据的异常
- 用于固定大小和预定义类型数据的C++向量、列表或数组
- OpenCV C++:从存储在 int 向量的索引中为垫子类型数据创建列范围
- C++静态匿名类类型数据成员
- C++在成员变量中保存不同类型数据的优雅方式
- 将键盘输入与枚举类型数据[C++]匹配
- 检查长类型数据是否在 int 范围内的便携式方法是什么?
- 用异构boost::融合向量类型数据填充std::vector
- 如何将HWND类型数据存储到平面文件中,并将其返回到HWND类型变量中
- 存储大量不同类型数据的最佳方式