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

+0

Очереди системы V. –

ответ

1

linux man page для msgrcv() утверждает, что вы должны использовать общий structue

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(), в зависимости от указанного типа, вы можете обрабатывать различные структуры по-разному, или вы можете вернуть их обратно в структуру, которую планируете отправить.

Например, после того, как вы получите STRUCT MSG_LOGIN_UNAME и STRUCT MSG_LOGIN_IPC_NUM, вы можете собрать их на приемном конце в исходное MSG_LOGIN структуры.

Другое возможное решение:

Вы можете использовать вложенные структуры, где все типы структур данных, которые вы используете, будет в одну структуру, наряду с полем типа, а также при получении, доступ специфические структуры в зависимости от типа ,

+0

Пожалуйста, не публикуйте ссылки на die net - это не актуально и не официальный источник информации для man-страниц Linux. Вместо этого рассмотрите использование kernel.org. – 2013-03-04 04:03:28

Смежные вопросы