LINUX.ORG.RU

Сокеты, браузер, write. Что здесь происходит?! [решено]

 , , ,


0

2

Есть сервер. Работает на локалхосте. Он создал слушающий сокет. Получив что-то на вход, он записывает в ответ msg. Клиент msg получает и отображает. Вот код:

char *msg = "HTTP/1.1 200 OK\n\n\n<h1>This is site</h1>";
/*...*/
read(socket_accept, buf, SIZE);
/*...*/
fprintf(stdout, "This is stdout\n");
write(socket_accept, msg, strlen(msg));
fprintf(stderr, "It's stderr\n");

Всё работает.

Но стоит увеличить третий параметр в write, например так:

write(socket_accept, msg, strlen(msg)+100);

Происходит интересное. Если клиент консольный - вроде бы всё нормально. Однако, если обратиться через браузер (127.0.0.1:port), то на страницу выдачи сначала попадает содержимое msg, затем результаты двух fprintf (начиная с первого), затем N одинаковых нераспознаваемых символов (примерно 100 минус длина результатов fprintf).

Что здесь происходит и почему?



Последнее исправление: Edward_I (всего исправлений: 2)
Ответ на: комментарий от i-rinat

Очевидно, что msg.
Ну или msg + мусор (это ещё как-то можно понять).
Но никак не рассчитываю на странице получить результат выхлопа:

 fprintf(stderr, "It's stderr\n");

Edward_I
() автор топика

Что здесь происходит

Выход за пределы массива.

и почему?

Строковые литералы обычно находятся вместе в секции .rodata, поэтому сразу после конца первого («HTTP...») идет второй («This is...») и т.д.

annulen ★★★★★
()
Ответ на: комментарий от Edward_I

Ну или msg + мусор (это ещё как-то можно понять).

Почему в твоём понимании «мусор» не может содержать осмысленные строки?

результат выхлопа

Не результат выхлопа, а собственно строковый литерал.

Представь себе, что ты пишешь компилятор. Где бы ты разместил строки в исполняемом файле и почему?

i-rinat ★★★★★
()

Если клиент консольный - вроде бы всё нормально.

А, вот ещё это осталось. В консольном клиенте ты наверняка через printf("%s\n", msg) выводишь строку?

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Edward_I

Ну, как ты уже понял, там всё останавливается на \0.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Не результат выхлопа, а собственно строковый литерал.

Да. Должен был понять т.к. до этого было что-то вроде:

printf("%d", strlen(msg));
которое отображалось в браузере как "%d".

Edward_I
() автор топика

Хосспади какая же говнина, передавать текст, который потом будет парсить машина, а не читать человек.

anonymous
()

А что тебя удивляет? То, что строковые литералы лежат подряд в каком-нибудь .rodata?

Makhno
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.