- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
msg->msgType = JOINREPLY;
memcpy((char *)(msg+1), &memberNode->addr.addr, sizeof(memberNode->addr.addr));
memcpy((char *)(msg+1) + 1 + sizeof(memberNode->addr.addr), &memberNode->memberList, sizeof(memberNode->memberList));
这是我想通过调用另一个函数从一个函数发送的消息,该函数是 send((char *)msg, msgsize);
msg的数据结构是
enum MsgTypes{
JOINREQ,
JOINREPLY,
DUMMYLASTMSGTYPE,
HEARTBEAT
};
typedef struct MessageHdr {
enum MsgTypes msgType;
}MessageHdr;
vector<MemberListEntry> memberList;
是memberList的定义,可以看到memberList是一个MemberListEntry类型的vector,MemberListEntry有自己的数据。
int id;
short port;
long heartbeat;
long timestamp;
由于我正在将完整的 memberList 转换为 (char *),是否可以再次将 (char *) 转换为 memberList 或 MemberListEntry 类型并对其进行迭代?
MemberListEntry *ml;
ml=(MemberListEntry *)malloc(sizeof(MemberListEntry));
for(char *j=finalData; i < (int)string(finalData).length(); j = (char *)(j+ sizeof(MemberListEntry))){
ml= (MemberListEntry *)j;
i+=sizeof(MemberListEntry);
idR=ml->getid();
portR=ml->getport();
heartbeatR=ml->getheartbeat();
//Do some stuff
}
“finalData”是我在删除 msgType 和我存储的地址后得到的数据,将我的指针指向我以 char 格式存储我的 memberList 的位置。
最佳答案
您需要在邮件 header 中包含一个字段,指示邮件包的整体大小。
可能是这样的:
typedef struct MessageHdr {
enum MsgTypes msgType;
unsigned int msgLength;
} MessageHdr;
存储在 msgLength 字段中的实际值取决于约定,例如它可以不同于整个消息包的大小或减去 header 的大小,或者只是 MemberListEntry
的计数。使用您喜欢的任何东西。
您使用 send((char *)msg, msgsize);
通过 tcp 套接字发送。但是,您的对等方无法找出重要的 msgsize
值来重建消息数据,除非您明确地将其作为消息 header 的一部分发送。
那么重建它们应该是微不足道的。
首先你应该弄清楚你的消息包中有多少条目。然后你分配一个那个大小的新 vector 。最后你 memcpy
所有数据到新 vector 中,一切都应该没问题。
原则 1:您无法从任何地方获取信息。
sizeof
起作用是因为编译器知道大小。 它们是根据规范、平台或您#include
d 的头文件预定义的。它们是固定的。而且它们永远不会改变。
.length()
之所以有效,是因为 std::vector
在场景下为您保留了长度信息。 您可以检查他们的自己对应头文件。
简而言之,它们都不是来自于自动找出任意内存区域中包含的内容的奇特魔法。
在您的情况下,信息 - “实际元素计数” - 是至关重要的。并且它必须可供对等方访问以重建数据结构。
原则 #2:其中包含指针的数据结构不能直接通过网络发送。
指针只在当前进程中有效。您不能盲目地通过网络发送指针。所以发送你聪明的 std::vector
也不起作用。尽管 std::vector
本身具有固定大小并且您可以对其应用 sizeof
,但它在内部使用指针来保存可以动态更改的实际数据。
好吧,您真正需要的是某种数据编码/对象序列化。您需要将数据转换为适合网络传输的某种表示形式,然后再将它们转换回来。在 C++ 领域,你必须自己做。没有魔法。
如果您觉得实现这样的事情真的很无聊,请考虑使用一些高级语言来为您处理对象序列化。例如,Javascript 原生支持著名的 JSON 格式,这种格式在数据交换方面非常出色。或者您可以使用 C#,它具有快速高效的强类型二进制序列化程序。
关于c++ - 我们可以在将对象转换为 (char *) 后取回对象吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29190820/
如何处理在 EditText 上键入时按返回键的事件?当显示虚拟键盘并且用户按回时,它会被隐藏。我想处理这个事件,但是在 EditText 中设置 OnKeyListener 并没有帮助。 最佳答案
我编写了 SMS 应用程序,并为其编写了 BroadcastReceiver。我想从 BroadcastReceiver 获取数据到我的 Activity 中,那么我该如何获取呢。 我的广播接收器代码
有一个场景,其中 httpentity 在 InputStream 中有图像的二进制数据,为了进一步处理,它被转换为库文件中的字符串 [String str = EntityUtils.toStrin
如何获取 uiwebview 的返回和转发 URL。我想要 URL,以便我可以相应地启用和禁用我的网络浏览器上的后退和前进按钮 谢谢 最佳答案 UIWebView 包含后退或前进的构建方法 只需使用执
CGRect rect = Temp_3_Artwork_Big_Image.frame; NSLog(@"Rect : %.2f,%.2f,%.2f,%.2f",rect.origin.x,rect
在返回旧项目并更新其依赖项后,我必须意识到,自版本 1.1.5 以来,logback 不再将 MDC 传播给子项:https://github.com/qos-ch/logback/commit/aa
holder.js 我想向我的页面动态添加占位符图像。 这样插入是行不通的: $('',{class:'file-item'}) .append($('',{'data-src':'holde
我在 C# 中使用 ExecuteOracleNonQuery 来使用存储过程将记录插入到我的 Oracle 数据库中,但似乎无法返回 ROWID。 在 C# 中 ... using (OracleC
我正在努力将一条记录插入到 postgresql 中: val res = DB.withConnection { implicit con => SQL(
我是新手,正在尝试使用 React 和 Redux 构建一个简单的书签应用程序。 我无法解决这个问题: 用户可以创建一个书签并将其添加到多个文件夹。所以我发送一个 addMark(bookmark)
我有一个像下面这样的网址 /pages/edit_product/11 在我的行动 edit_product我怎样才能得到 id 11 这样我就可以做@p = Product.find_by_id(1
我在php中有一个外部文件,输出为json格式 我希望数据以数组的形式发送回 jquery ....该怎么做? php: $options = "data 0 data 1 data 2 data 3
我有以下 C++ 代码: __declspec(dllimport) char* get_mac() { size_t byteToAlloc = 17; char *mac_addr
我正在编写一个 Azure 函数,该函数从 Microsoft 获取 OAuth token ,我已经成功获取了该 token 。我正在尝试使用该 token 访问 Microsoft Graph。我
我有一个 Python Google App Engine 应用程序,我想在 Emacs 中的开发服务器上进行调试。我创建了一个 pdb 可执行文件,以便在 Emacs 中进行调试: $ which
我正在开发一个 google chrome 扩展程序,需要在其中对 Twitch 上的用户进行身份验证。根据https://github.com/justintv/Twitch-API/blob/ma
我有一个简单的 Web API,它返回一个 Iobservable。我正在使用 HttpClient 获取 Observable,以便我可以订阅它。我的问题是订阅时返回的 Iobservable 发出
我正在使用 Ionic 2 构建 Web 应用程序的移动版本,该应用程序使用 SAML 进行 SSO,在我的客户端服务器上运行。现在我们有一个 api,当您未登录网站时会调用它,该网站会重定向到他们的
几个月前,我创建了一个使用 oauth2 与谷歌进行身份验证的 rails 应用程序 - 特别是 omniauth-google-oauth2 gem。我已经完成了创建身份验证和存储刷新 token
我正在尝试将一个值作为 JSON 从我的后端传递到我的应用程序的前端。我目前正在运行 express.js 并且所有发布方法的连接都是完美的。 在我的应用程序的前端单击按钮后,我想从我的服务器取回发票
我是一名优秀的程序员,十分优秀!