gpt4 book ai didi

c++ - 数据封装(网络编程)

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

我已经阅读了 BG 的网络编程简介,但有一个主题仍然存在疑问:数据封装。
基本上我创建了一个包含数据长度和消息的结构。例如:

struct Data
{
int length;
std::string message;
}

如何发送?使用send()函数,我只能发送char*类型的变量。
另外,当我发送它时,在服务器端,我是否应该创建一个由封装指定长度的动态缓冲区并将消息打包到其中?

最佳答案

C++ 中的常用方法是提供可以将您的自定义类型序列化为“流”对象的函数,然后提供一种方法来获取指向流中累积的数据 block 开头的指针。

一个简单的示例是 std::ostringstream,您可以使用它来将数据序列化为流,然后获取指向构造的字符串的指针:

int i = 13;
std::string message = "Hi";
std::ostringstream stream;
stream << i << message;

cout << stream.str() << endl; // prints "13Hi";

您可以为您的 Data 做同样的事情通过提供 << 的适当重载来键入和 >>运算符,如:

std::ostringstream &operator<<( std::ostringstream &stream, const Data &v ) {
return stream << v.length << v.message;
}

std::ostringstream &operator>>( std::ostringstream &stream, Data &v ) {
return stream >> v.length; >> v.message;
}

使用这些函数,您可以这样做:

Data myData = { 13, "Hello" };

std::ostringstream stream;
stream << myData;

const std::string serializedData = stream.str();
send( .., serializedData.c_str(), serializedData.size() + 1, .. );

关于接收大小,您可以将数据读入缓冲区,然后使用 std::istringstream对象再次提取数据:

const char receivedData[ 1024 ];
// fill receivedData array using recv()

std::string s = receivedData;
std::istringstream stream( s );
Data myData;
stream >> myData;

您可能需要稍微缓冲接收到的数据,直到从流中读取成功。

关于c++ - 数据封装(网络编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5461168/

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