357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
1

Сервер в конце сообщения добавляет непонятные мне символы

06.11.2018, 21:00. Показов 1037. Ответов 9

Author24 — интернет-сервис помощи студентам
После того, как серверу были посланы заголовки от браузера, он, вернув функции recv() код запрошенной html-страницы, добавил в ее конец символы: LF 0 LF LF (т.е. \n0\n\n. Правильно ли я понимаю, что это - признак окончания ответа сервера на запрос? Дело в том, что функция recv() вновь ожидает прием сообщения, т.е. цикл, в котором она находится, не прерывается.

Добавлено через 22 минуты
И еще какая-то любопытная вещь. При компиляции вот этого:
C
1
2
while((x=recv(sock, buffer, sizeof(buffer), 0)) > 0)
    {printf("%s", buffer)};
при помощи g++ в КОНЦЕ каждого фрагмента (точнее, в конце каждого фрагмента, размер которого совпадает с sizeof(buffer) ) сообщения появляются символы kSOH, причем strlen(buffer)-x = 2.
А вот при компиляции при помощи gcc таких символов нет и strlen(buffer)-x = 0.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.11.2018, 21:00
Ответы с готовыми решениями:

Строки (добавляет какие-то непонятные символы)
Есть функция, которая возвращает строку. char *create_string(int Q1, int Q2, int Q3, int S1, int...

Чтения из файла - в конце появляются непонятные символы
Читаю из файла так char str; char ch; int i=0; while ( (ch = getc(fp)) != EOF ) {...

Когда считываю информацию с файла, то выводит в конце непонятные символы
#include "stdafx.h" #include <iostream> #include <conio.h> #include <string.h> #include...

Delphi сам добавляет '.' в конце
Delphi ведет себя как хочет, как будто он ожил.В конце пути c:/argu.ini он добавляет точку и...

9
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
06.11.2018, 21:04 2
Цитата Сообщение от Htext Посмотреть сообщение
LF 0 LF LF
Я так понима., речь об HTTP? Если точно так, то даже не знаю, что это такое. 0 CR LF - последний чанк (при Transfer-Encoding: chunked в заголовках ответа), но не обязательно конец ответа.
1
357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
06.11.2018, 21:17  [ТС] 3
Цитата Сообщение от prik Посмотреть сообщение
речь об HTTP
Да.

Добавлено через 1 минуту
Цитата Сообщение от prik Посмотреть сообщение
0 CR LF
А это зависит от ОС сервера? Я работаю в Linux, сервер тоже на Linux.

Добавлено через 1 минуту
Цитата Сообщение от prik Посмотреть сообщение
Transfer-Encoding: chunked в заголовках ответа
Точно. есть такой заголовок!

Добавлено через 1 минуту
Цитата Сообщение от prik Посмотреть сообщение
последний чанк
Т.е. это - последний фрагмент сообщения?

Добавлено через 7 минут
И еще один парадокс (для меня): между заголовками ответа сервера и html-кодом. как и положено, есть пустая строка. НО: после нее, перед тегом <html> есть символы 285а. Что это такое? Это, случайно, не ВОМ какой-нибудь?
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
06.11.2018, 21:22 4
Цитата Сообщение от Htext Посмотреть сообщение
это зависит от ОС сервера
Не должно. Покрайней мере в rfc явно пишут CRLF.
Цитата Сообщение от Htext Посмотреть сообщение
{printf("%s", buffer)};
buffer это не строка в Си смысле, нужно закрыть его содержимое \0 перед вызовов strlen()/printf().
Раз это HTTP и хочется уметь Keep Alive - нужно парсить заголовок.

Добавлено через 4 минуты
Цитата Сообщение от Htext Посмотреть сообщение
Т.е. это - последний фрагмент сообщения?
Да, но повторюсь это != конец тела сообщения, после могут быть еще данные.
Цитата Сообщение от Htext Посмотреть сообщение
НО: после нее, перед тегом <html> есть символы 285а. Что это такое?
"Заголовок" чанка (в данном случае его длина)
1
357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
07.11.2018, 10:57  [ТС] 5
Цитата Сообщение от prik Посмотреть сообщение
buffer это не строка в Си смысле, нужно закрыть его содержимое \0 перед вызовов strlen()/printf().
Вообще, это странно, ведь С, вроде бы, автоматически добавляет \0, если этого не было сделано в программе.

Добавлено через 9 минут
Добавил \0 принудительно - результаты не изменились: ни в gcc, ни в g++.
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
08.11.2018, 16:43 6
Цитата Сообщение от Htext Посмотреть сообщение
Вообще, это странно, ведь С, вроде бы, автоматически добавляет \0, если этого не было сделано в программе.
Нет такого.
Цитата Сообщение от Htext Посмотреть сообщение
Добавил \0 принудительно - результаты не изменились: ни в gcc, ни в g++.
Код смотреть надо
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
08.11.2018, 23:04 7
LF 0 LFLF наверное добавилось из какого нибудь интерпретатора, в котором отработала сишная sprintf(). И если не изменяет память, то если в хттп заголовке был параметр Connection: close, то recv вернёт ноль.
0
357 / 118 / 20
Регистрация: 08.01.2015
Сообщений: 1,361
Записей в блоге: 1
09.11.2018, 14:58  [ТС] 8
Еще один "нюанс". Иногда
Цитата Сообщение от prik Посмотреть сообщение
Нет такого.
Т.е. Вы хотите сказать, что если я напишу char* x = "abcd"; то \0 не добавится к этой строке (точнее, строчному массиву) автоматически?...
Понятно. Дальше без комментариев.

Добавлено через 7 минут
Цитата Сообщение от Вованя Посмотреть сообщение
параметр Connection: close, то recv вернёт ноль.
Это немного не тот 0. Под этим 0 подразумевается, что длина последнего полученного сообщения будет равна 0 - пустое сообщение (точнее, последний фрагмент сообщения - пустой, не содержащий данных). Это да, в отличие от keep-alive.
Я же имел в виду - добавляется указанные символы в конец сообщения.
Насколько я уже вижу, это, похоже, стандартные символы, которые присутствуют в конце каждого сообщения (в последнем его фрагменте) сервера.
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
09.11.2018, 15:36 9
Цитата Сообщение от Htext Посмотреть сообщение
Т.е. Вы хотите сказать, что если я напишу char* x = "abcd"; то \0 не добавится к этой строке (точнее, строчному массиву) автоматически?...
Как это связанно с вашим косяком из 1го сообщения? Спрошу иначе: Кто "автоматически" должен писать \0 в buffer[x] после recv() ?
По теме: В устаревших стандартах на HTTP/1.1 говорят, что приложение должно (но не в смысле MUST) быть толерантным и понимать только LF игнорируя CR как терминатор строк. В актуальных версиях я этого замечания не нашел.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
10.11.2018, 06:30 10
Цитата Сообщение от Htext Посмотреть сообщение
не добавится к этой строке (точнее, строчному массиву) автоматически?
Не путай время компиляции, и как заметил priik, и время исполнения.
0
10.11.2018, 06:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2018, 06:30
Помогаю со студенческими работами здесь

В директории сохранения файла русские символы заменяются на непонятные символы
При сохранении файл через диалоговое окно русские символы заменяются на непонятные тем самым Window...

Появляются непонятные знаки ММММ в конце строки :(
int main(int args, const char * argv) { setlocale(LC_ALL, &quot;Russian&quot;); ...

cma ARISTON ARTF 1047 RU 73764170000, в конце программы добавляет время постоянно
День добрый всем! На новом блоке с новой прошивкой ARTF 1047 ведет себя как при заявленном дефекте-...

Непонятные мне преобразования dx11
Всем здрасьте.Тут я попрошу мне обяснить , непонятные мне преобразования в dx11 с векторами и...

Непонятные сообщения в Eclipse IDE
Всем здравствуйте. Пытаюсь изучить Java по книге Файн Я. - Программирование на Java для детей,...

VK API. Wall Post добавляет два сообщения вместо одного
Всех с наступающим! Уважаемые программисты, нужна помощь по API вконтакте. Код следующий: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru