Сетевое программирование на C ++ в Linux: вопросы о сервере - PullRequest
1 голос
/ 13 октября 2010

Я изучаю, как программировать по сети с использованием c / c ++, и я создал сервер (TCP), который должен отвечать определенным образом на сообщения от клиента. Для этого я создал класс, который передает класс сервера. сообщение и возвращает строку для отчета клиенту.

Вот моя проблема, иногда она сообщает правильную строку в другое время, если просто повторяет то, что я отправил обработчику сообщений. Куда ни в каком месте кода я получаю возвращаемое, что было передано. Поэтому мне интересно, правильно ли я получаю сообщение?

Во-вторых, я не уверен, как сохранить соединение открытым во время цикла, чтобы непрерывно передавать сообщения туда и обратно. Вы можете увидеть, как я это сделал, в приведенном ниже коде, но я уверен, что это неверно, любая помощь по этому вопросу была бы полезна. Спасибо!

if (!fork())
    { // this is the child process
        close(sockfd); // child doesn't need the listener

        while ((numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0)) > 0)
        {
            //numbytes = recv(new_fd, buf, MAXDATASIZE-1, 0);

            buf[numbytes-1] = '\0';
            const char* temp = ash.handleMessage(buf).c_str();
            int size_of_temp = ash.handleMessage(buf).length();
            send(new_fd, temp, size_of_temp, 0);

            //send(new_fd, temp, size_of_temp+1, 0);
        }
    }//end if

Извините, пожалуйста, мой код гетто

Обрабатывает сообщение

Обработчик метода класса использует

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

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

Если вы отправите ()некоторые большие данные от вашего клиента вам может понадобиться использовать несколько recv () на сервере (или наоборот), чтобы прочитать все это.Это большая разница в том, как обычно работают файлы ...

Если вы разрабатываете свой собственный протокол, вы также можете отправить длину сообщения, например [LEN] [message].Простым примером будет, если отправляемые строки ограничены 256 байтами, которые вы можете начать с send (), используя short , представляющий длину строки,

Или проще, решите, что вы используете строку-feeds (новая строка - \ n), чтобы прекратить сообщения.Протокол будет выглядеть так:

"msg1 \ nmsg2 \ n"

, тогда вам придется выполнять recv () и добавлять данные, пока вы не получите новую строку.Это все, что я могу собрать прямо сейчас, в интернете есть много отличных примеров, но я бы порекомендовал получить источник какой-нибудь «настоящей» программы и посмотреть, как она обрабатывает свою сеть.

1 голос
/ 13 октября 2010

Вы звоните handleMessage дважды.Вы не опубликовали код, но похоже, что вы возвращаете string.Может быть лучше сделать:

        string temp = ash.handleMessage(buf);
        int size_of_temp = temp.length();

Это позволит избежать повторения любого действия, которое происходит в handleMessage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...