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

标签 c sockets structure protocols

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

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.

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

最佳答案

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

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

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

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

查看此链接了解更多详情

Send struct over socket in C

关于c - 当您不知道接收到哪个结构时如何从结构接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539928/

相关文章:

c - Malloc 一维指针数组错误

c - 对结构中的指针所指向的数组进行索引

c - 在 C 中按字母顺序对字符串和结构进行排序

c - Apache 模块创建教程包含有错误的代码。怎么修?

c - HTTP代理服务器C开发

c++ - c/c++ | int * 除外,给定 int (返回指针??)

linux - BSD 套接字头

java - 在 Java 中接收时 TCP 套接字挂起

java - 服务链 - Java

c - 带有 * 的 typedef 结构到 c 中的名称