Странное поведение сервера C - PullRequest
0 голосов
/ 12 февраля 2012

Итак, у меня есть этот фрагмент кода, который просто прочитает сообщение от клиента и ответит "yup"

while(strcmp(buffer, "QUIT") != 0){ 
    bzero(buffer, 255); //cleans the read buffer

    /*this reads the aux (request) from the client*/
    recv(newsockfd, buffer, 255, 0);

    if(strlen(buffer))
        printf("Thread %d: %s\n", thread_no, buffer);
    fflush(stdout);

    write(newsockfd, "yup\n", 4);
}

Проблема в том, что при первом чтении все идет хорошо, но все остальные показания портятся, например, если я отправляю сообщение «гитара», он получает «g», петли, а затем - « Uitar ", отправив другой" Yup ".

Понятия не имею, что происходит.

Ответы [ 3 ]

6 голосов
/ 12 февраля 2012

Короче говоря: TCP не протокол, ориентированный на сообщения, это протокол, ориентированный на поток. Сообщения могут быть фрагментированы или объединены вместе, и ваше приложение должно с этим справиться (единственная гарантия - вы получите данные в том же порядке , в который вы их отправили).

0 голосов
/ 12 февраля 2012

Три других ошибки в фрагменте кода выше.

1) Не проверяется возвращаемое значение из recv (). Сокет мог быть изящно закрыт (возвращаемое значение == 0), произошла ошибка (возвращаемое значение == -1) и т. Д. Что еще более важно, нельзя утверждать, что вы получите все 4 байта "QUIT" сообщение, которое было отправлено с помощью удаленного вызова. Вы можете получить только «Q».

2) Если recv () получит 255 символов (ни один из которых не является нулевым символом), то последующая функция strlen () будет считана в недопустимую память и, возможно, завершится сбоем.

3) Не проверяется возвращаемое значение вызова записи.

0 голосов
/ 12 февраля 2012

recv() читает столько данных, сколько доступно в настоящее время. Вы должны читать, пока не нажмете EOF, ошибку или перевод строки. Только если у вас есть эта новая строка, у вас есть полная строка, которую вы затем сравниваете с «ВЫЙТИ» и которую вы подтверждаете с помощью «Да».

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