разработать Unix сервер очереди сообщений для нескольких клиентов - PullRequest
0 голосов
/ 27 февраля 2020

Что я должен изменить в приведенных ниже кодах, чтобы использовать только одну очередь сообщений для одного сервера и нескольких клиентов. Я почти уверен, что мне нужно присвоить различные значения msgid, а затем использовать это для извлечения сообщений из очереди сообщений, но не совсем уверен, прав ли я и как это реализовать. Буду благодарен за любую помощь.

Код1:

struct my_msg_st { 
     long int my_msg_type; 
     char some_text[BUFSIZ];
};

int main() {
    int running = 1;
    int msgid;
    struct my_msg_st some_data; 
    long int msg_to_receive = 0

    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

    if (msgid == -1) {
         fprintf(stderr, “msgget failed with error: %d\n”, errno);
         exit(EXIT_FAILURE);
    }

    while(running) {
        if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) {
              fprintf(stderr, “msgrcv failed with error: %d\n”, errno); 
              exit(EXIT_FAILURE);
        }
        printf(“You wrote: %s”, some_data.some_text);
        if (strncmp(some_data.some_text, “end”, 3) == 0) {
              running = 0;
        }
    }

    if (msgctl(msgid, IPC_RMID, 0) == -1) { 
        fprintf(stderr, “msgctl(IPC_RMID) failed\n”);         
        exit(EXIT_FAILURE);
    }

    exit(EXIT_SUCCESS); 
}

Код 2:

#define MAX_TEXT 512

struct my_msg_st {
     long int my_msg_type; char some_text[MAX_TEXT];
};

int main() {
     int running = 1;
     struct my_msg_st some_data; int msgid;
     char buffer[BUFSIZ];
     msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

     if (msgid == -1) {
           fprintf(stderr, “msgget failed with error: %d\n”, errno);         
           exit(EXIT_FAILURE);
     }

     while(running) {
           printf(“Enter some text: “); 
           fgets(buffer, BUFSIZ, stdin); 
           some_data.my_msg_type = 1; 
           strcpy(some_data.some_text, buffer); 

           if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {          
                 fprintf(stderr, “msgsnd failed\n”);
                 exit(EXIT_FAILURE);
           }

           if (strncmp(buffer, “end”, 3) == 0) {
                 running = 0;
           }

     }
     exit(EXIT_SUCCESS); 
 }

1 Ответ

0 голосов
/ 24 марта 2020

Я предлагаю вам создать одну очередь, и каждое сообщение, которое вы отправляете в очередь sh, должно иметь другое значение для my_msg_type вместо жесткого кодирования его в 1, как вы это сделали. Это отображение между клиентом и сервером. Каждый клиент может быть пронумерован от 1 до n.

some_data.my_msg_type = client_id;

Как только это будет сделано для каждого клиента, вы можете вызвать msgrcv с соответствующим ему идентификатором клиента. Это можно сделать, используя идентификатор клиента в качестве 4-го аргумента в msgrcv.

msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, client_id)

Таким образом, у вас есть один сервер, генерирующий данные для нескольких клиентов.

Надеюсь, это поможет!

...