首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据封装(网络编程)

数据封装(网络编程)
EN

Stack Overflow用户
提问于 2011-03-28 23:19:51
回答 2查看 609关注 1票数 5

我读过BG的Introduction to Network Programming,但有一个话题仍然值得怀疑:数据封装。

基本上,我创建了一个包含数据长度和消息的结构。例如:

代码语言:javascript
复制
struct Data
{  
    int length;  
    std::string message;  
}

我该怎么寄呢?使用send()函数,我只能发送char*类型的变量。

另外,当我在服务器端发送它时,我是否应该创建一个由封装指定长度的动态缓冲区,并将消息打包到其中?

EN

回答 2

Stack Overflow用户

发布于 2011-03-28 23:27:04

C++中的常见方法是提供一些函数,这些函数可以将您的自定义类型序列化为一个“流”对象,然后提供一种方法来获取指向流中累积的数据块的起始位置的指针。

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

代码语言:javascript
复制
int i = 13;
std::string message = "Hi";
std::ostringstream stream;
stream << i << message;

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

您可以通过提供适当的<<>>操作符重载来对Data类型执行相同的操作,如下所示:

代码语言:javascript
复制
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;
}

使用这些函数,您可以执行以下操作:

代码语言:javascript
复制
Data myData = { 13, "Hello" };

std::ostringstream stream;
stream << myData;

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

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

代码语言:javascript
复制
const char receivedData[ 1024 ];
// fill receivedData array using recv()

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

您可能需要对接收到的数据进行一段时间的缓冲,直到从流中读取成功。

票数 2
EN

Stack Overflow用户

发布于 2011-03-28 23:31:27

Send()使用char*来允许以一个字节的倍数发送任何二进制数据。您是否尝试过强制转换为char*

在接收端,您必须解压前几个字节以发现长度。当然,这种方法假设发送者和接收者使用相同长度的int。你也应该小心你发送给编译器的打包参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5461168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档