首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >msgrcv() -接收各种消息

msgrcv() -接收各种消息
EN

Stack Overflow用户
提问于 2013-03-04 08:19:29
回答 1查看 778关注 0票数 0

在我的项目中,协议(不可更改)指定了以下结构:

代码语言:javascript
复制
typedef struct {
long type;
char username[USER_NAME_MAX_LENGTH];
int ipc_num;
}MSG_LOGIN;


typedef struct{
long type;
int msg_type;
char send_time[6];
char sender[USER_NAME_MAX_LENGTH];
char receiver[USER_NAME_MAX_LENGTH];
char message[MAX_MSG_LENGTH];
}MSG_CHAT_MESSAGE;

typedef struct{
long type;
int request_type;
char user_name[USER_NAME_MAX_LENGTH];
}MSG_REQUEST;

客户端可以将这些结构中的任何一个发送到服务器,服务器必须做出相应的反应。我正在编写一个服务器,不知道如何使用msgrcv()来接收它们。当我只有一个这样的结构时,这很容易-我只需要向它传递一个指向这种类型的空结构的指针。但是如果我事先不知道我会收到哪一个呢?我应该只定义struct generic {long type; char buffer[BIG_NUMBER];}吗?如果是这样,我是否能够将数据提取到单个变量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-04 11:38:21

msgrcv()的linux man page声明您必须使用泛型结构

代码语言:javascript
复制
struct msgbuf {
    long mtype;                             /* message type, must be > 0 */
    char username[USER_NAME_MAX_LENGTH];    /* message data */
};

我想不出任何可能的方法来避免使用泛型结构。但我确信,通过将现有结构拆分成多个其他通用结构,您的客户机/服务器可以修改为使用通用结构

例如,以struct MSG_LOGIN为例,我可以建议进行一些修改

代码语言:javascript
复制
typedef struct {
long mtype;
char username[USER_NAME_MAX_LENGTH];
int ipc_num;
}MSG_LOGIN_UNAME;

typedef struct {
long mtype;
int ipc_num;
}MSG_LOGIN_IPC_NUM;

当您使用msgrcv()接收消息时,根据指定的类型,您可以以不同的方式处理各种结构,也可以将它们收集回您计划发送的结构中。

例如,收到struct MSG_LOGIN_UNAME和struct MSG_LOGIN_IPC_NUM后,可以在接收端将它们重新组合到原始的MSG_LOGIN结构中。

另一个可能的解决方案

您可以使用嵌套结构,在这种结构中,您使用的所有类型的数据结构将与类型字段一起放入一个结构中,并在接收时根据类型访问特定的结构。

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

https://stackoverflow.com/questions/15192625

复制
相关文章

相似问题

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