2013-03-04 89 views
0

在我的项目,协议(不可改变)指定以下结构:msgrcv() - 接收各种消息

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];}?如果是这样,我能否将数据提取到单个变量?

+0

您使用IPC的机制是什么? – Kitsune 2013-03-04 00:26:19

+0

系统V队列。 – 2013-03-04 00:29:09

回答

1

linux man page对msgrcv()规定,你必须使用一个通用的药结构

struct msgbuf { 
    long mtype;        /* message type, must be > 0 */ 
    char username[USER_NAME_MAX_LENGTH]; /* message data */ 
}; 

我想不出任何可能的方式,以避免使用通用的结构。但我相信你的客户机/服务器可以被修改为使用通用结构,通过拆分现有的结构到多个其他通用结构

例如,考虑结构MSG_LOGIN,做一些修改,我可以建议是

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()的基础上,指定类型的收到消息,您可以以不同方式处理各种结构,或者你可以收集他们回来INT你正准备发送的结构。

例如,收到结构MSG_LOGIN_UNAME和struct MSG_LOGIN_IPC_NUM后,就可以在接收端重新组合成原来的MSG_LOGIN结构。所有使用类型的数据结构,将进入一个结构,类型字段一起,并且一旦接收,访问特定结构基础型

您可以使用嵌套结构,:

另一种可能的解决方案

+0

请不要张贴链接死网 - 它既不是最新的,也没有对Linux的man信息的官方消息。考虑使用kernel.org代替。 – 2013-03-04 04:03:28