我正在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.
那么,我如何知道在服务器端接收到的结构呢?
请帮助我,如果问题看上去如此愚蠢,那么请建议我阅读该主题的文章或名称。
谢谢。
发布于 2014-03-20 16:59:03
这是您应该进行消息序列化的地方。无论您从客户端发送的结构是什么,都应该在通过网络发送时将其序列化为字符流。另外,让消息的第一个元素是一个标识符,让服务器知道它是什么结构。
将结构转换为char缓冲区的示例:
memcpy(data, ®n, sizeof(regn));
regn - a struct
data - allocated char pointer请注意,如果您的客户端和服务器存在于不同的平台中,则需要处理endianness。
有关详细信息,请查看此链接。
发布于 2014-03-20 17:00:24
在读取消息的其余部分之前,服务器需要先获得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字段的消息的大小。
发布于 2014-03-20 16:54:55
因为你在第一次会员时已经有身份证了。您可以单独阅读int吗?然后这个id的有效载荷依赖于。(您必须读取msgcontent类型,因为id已经读取了。
https://stackoverflow.com/questions/22539928
复制相似问题