C ++ сервер / клиентская программа чата - PullRequest
0 голосов
/ 30 апреля 2018

Я работаю над серверной многоклиентской программой чата и создал метод, который печатает ввод, который сервер вводит во ВСЕ соответствующие клиенты.

Метод:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    const char strExit [20] = "Server: terminated.";

    while(1) {
        scanf ("%s", strBuf);
        int i;
        for (i=0; i < nClient; i++){
            if (strcmp(strBuf,"Exit") == 0){
                write (nFDList [i], strExit, strlen (strExit) + 1);
                quick_exit (EXIT_SUCCESS);
            }
            else {
                write (nFDList [i], strBuf, strlen (strBuf) + 1);
            }
        }
    };
}

Однако, когда я набираю «Выход» на стороне сервера, он выводит только «Сервер: завершен». на первый клиент, который я открываю, а когда я набираю что-либо еще, он распечатывает сообщение с сервера всем клиентам. Как я могу заставить сервер печатать strExit для всех клиентов, таких как strBuf?

ПРИМЕЧАНИЕ. NFDList [i] - это массив, в котором хранятся клиенты.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Поскольку, как вы правильно заметили, единственной разницей между отправкой обычного сообщения и сообщением о завершении работы является текст, используемый при отправке, то вы можете «сделать то, что действительно верно», имея только одно вхождение отправления логика и манипулирование вводом.

Вот предложенная альтернатива, более сухая:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    char flagExit = 0;
    const char strExit [20] = "Server: terminated.";
    while(1) {
        scanf ("%s", strBuf);

        if (strcmp(strBuf, "Exit") == 0){
            strncpy(strBuf, strExit, strlen(strExit));
            flagExit = 1;
        }

        int i;
        for (i=0; i < nClient; i++){
            write (nFDList [i], strBuf, strlen (strBuf) + 1);
        }

        if (flagExit) {
            quick_exit (EXIT_SUCCESS);
        }
    }
}
0 голосов
/ 01 мая 2018

Чтобы заставить его напечатать «Сервер: прерван». всем клиентам я должен был изменить свой код следующим образом:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    const char strExit [20] = "Server: terminated.";
    while(1) {
        scanf ("%s", strBuf);
        int i;
        for (i=0; i < nClient; i++){
            if (strcmp(strBuf,"Exit") == 0){
                for (i=0; i < nClient; i++){
                    write (nFDList [i], strExit, strlen (strExit) + 1);
                }
                quick_exit (EXIT_SUCCESS);
            }
            else {
                write (nFDList [i], strBuf, strlen (strBuf) + 1);
            }
        }
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...