2013-03-04 87 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