【问题标题】:how to receive the data from structure when you do not know which structure received当您不知道接收到哪个结构时如何从结构中接收数据
【发布时间】:2014-03-20 16:53:13
【问题描述】:

我正在linux环境下用c开发客户端服务器应用程序。
我使用了一些通信协议。
客户端可以发送以下两种结构中的任何一种。

1)

typedef struct
{
  String userName;
} user;

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

2)

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.

那么,我怎么知道服务器端接收到的结构是什么?
请帮助我,如果问题看起来很愚蠢,请建议我阅读文章或主题名称。
谢谢你。

【问题讨论】:

  • 什么是String?请记住,您要传输的数据必须是 POD。

标签: c sockets structure protocols


【解决方案1】:

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

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

memcpy(data, &regn, sizeof(regn));  
regn - a struct
data - allocated char pointer

请注意,如果您的客户端和服务器存在于不同的平台上,您需要注意字节顺序。

查看此链接了解更多详情

Send struct over socket in C

【讨论】:

    【解决方案2】:

    服务器需要先获取ID,然后才能读取消息的其余部分:-

    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 字段的消息大小。

    【讨论】:

    • 我怎样才能确定呢?请给我一个想法。
    • @user2742399:在服务器上,第二次读取不会读取 switch 语句中的 msg1 结构(例如),它会读取用户结构,因为 msg1 结构中的 msgId 已经被读取通过 switch 之前的第一个 read 语句。
    【解决方案3】:

    因为您在第一个成员中已经有一个 id。你可以单独阅读 int?然后是依赖于该 id 的有效负载。 (您必须阅读 msgcontent 类型,因为 id 已被读取。

    【讨论】:

    • @vlad_tepesch msgId 是我在发送的所有消息正文中放置的内容。我得到你了吗?
    【解决方案4】:

    使整个事物成为一个包含联合的结构:

    union rcv
    {
        struct msg1 m1;
        struct msg2 m2;
    };
    
    struct msg 
    {
        int msg_id;
        union rcv msg;
    };
    

    【讨论】:

    • 我会建议一个包含 id 的顶级结构,然后是一个包含所有数据结构的联合“内容”,因为 id 不属于数据结构。
    • 我已经在上面的示例代码中提出过,但是忘记在文中提及了,谢谢。
    • 您的联合成员缺少变量名。它令人困惑,因为 op 不使用大写命名约定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2013-01-09
    • 2021-02-13
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多