在我的项目中,协议(不可更改)指定以下结构:
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 :(得分:1)
msgrcv()的linux man page表示您必须使用通用结构
struct msgbuf {
long mtype; /* message type, must be > 0 */
char username[USER_NAME_MAX_LENGTH]; /* message data */
};
我想不出任何可能的方法来避免使用通用结构。但我确信您的客户端/服务器可以通过将现有结构拆分为多个其他通用结构来修改以使用通用结构
例如,考虑struct 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()接收消息时,根据指定的类型,您可以以不同的方式处理各种结构,或者您可以将它们收集回您计划发送的结构中。
例如,在收到结构MSG_LOGIN_UNAME和结构MSG_LOGIN_IPC_NUM之后,您可以在接收端将它们重新组合为原始的 MSG_LOGIN 结构。
另一种可能的解决方案:
您可以使用嵌套结构(您使用的所有类型的数据结构)与一个结构以及类型字段一起使用,并在接收时根据类型访问特定结构。