0

私のプロジェクトでは、プロトコル (変更不可) は次の構造を指定します。

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()を受信する方法がわかりません。そのような構造体が 1 つしかない場合は簡単です。そのような型の空の構造体へのポインターを渡すだけです。しかし、どちらを受け取るか前もってわからない場合はどうすればよいですか? 定義するだけstruct generic {long type; char buffer[BIG_NUMBER];}ですか?もしそうなら、データを個々の変数に抽出することはできますか?

4

1 に答える 1

1

msgrcv()のLinux のマニュアル ページには、一般的な構造体を使用する必要があると記載されています。

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() を使用してメッセージを受信すると、指定されたタイプに基づいて、さまざまな構造をさまざまな方法で処理したり、送信する予定の構造にそれらを収集したりできます。

たとえば、構造体 MSG_LOGIN_UNAME と構造体 MSG_LOGIN_IPC_NUM を受け取った後、受信側でそれらを元のMSG_LOGIN構造体に再構築できます。

別の可能な解決策

ネストされた構造体を使用できます。使用するすべてのタイプのデータ構造体は、タイプ フィールドとともに 1 つの構造体になり、受信時にタイプに基づいて特定の構造体にアクセスします。

于 2013-03-04T03:38:20.813 に答える