首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当您不知道接收到哪种结构时,如何从结构接收数据

当您不知道接收到哪种结构时,如何从结构接收数据
EN

Stack Overflow用户
提问于 2014-03-20 16:53:13
回答 4查看 143关注 0票数 2

我正在linux环境中用c++开发客户机服务器应用程序。

我用了一些通讯协议。

客户端可以发送以下两种结构中的任何一种。

1)

代码语言:javascript
运行
复制
typedef struct
{
  String userName;
} user;

typedef struct
{
  msgId = 20;
  user u1;
} msg1;

2)

代码语言:javascript
运行
复制
typedef struct
{
  String mailId;
} mail;

typedef struct
{
  msgId = 30;
  mail m1;
} msg2;

现在假设客户端在将数据填充到结构后将msg2发送到服务器。

write (socket_fd, (struct sockaddr*)&msg2, sizeof(msg2));

在服务器端,当我收到结构时

read (client_socket_fd, &a, sizeof(a)); // here I have written &a because I do not know which structure I received.

那么,我如何知道在服务器端接收到的结构呢?

请帮助我,如果问题看上去如此愚蠢,那么请建议我阅读该主题的文章或名称。

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2014-03-20 16:59:03

这是您应该进行消息序列化的地方。无论您从客户端发送的结构是什么,都应该在通过网络发送时将其序列化为字符流。另外,让消息的第一个元素是一个标识符,让服务器知道它是什么结构。

将结构转换为char缓冲区的示例:

代码语言:javascript
运行
复制
memcpy(data, &regn, sizeof(regn));  
regn - a struct
data - allocated char pointer

请注意,如果您的客户端和服务器存在于不同的平台中,则需要处理endianness。

有关详细信息,请查看此链接。

Send struct over socket in C

票数 3
EN

Stack Overflow用户

发布于 2014-03-20 17:00:24

在读取消息的其余部分之前,服务器需要先获得ID:-

代码语言:javascript
运行
复制
read (socket_fd, &message_id, sizeof message_id);
switch (message_id)
{
case 20:
  read (socket_fd, &user, sizeof user);
  break;

case 30:
  read (socket_fd, &mail, sizeof mail);
  break;
}

请小心,确保第二次读取使用了没有前缀ID字段的消息的大小。

票数 3
EN

Stack Overflow用户

发布于 2014-03-20 16:54:55

因为你在第一次会员时已经有身份证了。您可以单独阅读int吗?然后这个id的有效载荷依赖于。(您必须读取msgcontent类型,因为id已经读取了。

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

https://stackoverflow.com/questions/22539928

复制
相关文章

相似问题

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