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

时间:2014-03-20 16:53:14

标签: c sockets structure protocols

我正在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.

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

查看此链接了解更多详情

Send struct over socket in C

答案 1 :(得分:3)

在阅读消息的其余部分之前,服务器需要先获取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字段。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

union rcv
{
    struct msg1 m1;
    struct msg2 m2;
};

struct msg 
{
    int msg_id;
    union rcv msg;
};