![]() |
![]() |
#1 |
Заслуженный Участник
|
![]()
делаю раз:
Код:
[root@v]#echo -e "GET cache_object://127.0.0.1/info HTTP/1.0\r\n\r\n" GET cache_object://127.0.0.1/info HTTP/1.0 Код:
[root@v]# nc 127.0.0.1 8083 ввожу ручками: GET cache_object://127.0.0.1/info HTTP/1.0 делаю три: Код:
[root@v]# echo -e "GET cache_object://127.0.0.1/info HTTP/1.0\r\n\r\n" | nc 127.0.0.1 8083 [root@v]#
__________________
Lies, damn lies, and statistics. |
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#3 | |
Заслуженный Участник
|
![]()
фиг его знает, товарищ майор. я попробовал у себя
Цитата:
это точно bash, не sh?
__________________
Ой, девоньки, вот всё, про что вы говорите — так у меня то же самое, только в сто раз больше! |
|
![]() |
![]() |
Благодарность от: | AlexM (02.04.2009) |
![]() |
#4 |
Заслуженный Участник
|
![]()
RFC 2616 говорит нам, что разделителем строк в данном случае служат пары CRLF
__________________
Ой, девоньки, вот всё, про что вы говорите — так у меня то же самое, только в сто раз больше! |
![]() |
![]() |
![]() |
#5 | |
Заслуженный Участник
|
![]() Цитата:
пасиб энивей....
__________________
Lies, damn lies, and statistics. |
|
![]() |
![]() |
![]() |
#8 |
Practical UNIX Terrorist
|
![]()
AlexM, сделай
echo -e "GET cache_object://127.0.0.1/info HTTP/1.0\r\n\r\n" | strace nc 127.0.0.1 8083 и запости результат сюда, можно аттачем
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#9 |
Заслуженный Участник
|
![]()
это мне легко
__________________
Lies, damn lies, and statistics. |
![]() |
![]() |
![]() |
#10 |
Заслуженный Участник
|
![]()
наблюдается странная картина. строка в сокет успешно записана:
write(3, "GET cache_object://127.0.0.1/inf"..., 47) = 47 дальше nc ждет, не появилось ли чего на чтение из сокета или из stdin poll([{fd=3, events=POLLIN}, {fd=0, events=POLLIN, revents=POLLHUP}], 2, -1) = 1 что-то появилось. дальше сокет успешно закрывается от дальнейшей записи shutdown(3, 1 /* send */) = 0 а вот здесь меня смущает, что проверяются сразу два дескриптора, второй из которых равен -1 - заведомо несуществующий. poll([{fd=3, events=POLLIN, revents=POLLIN|POLLHUP}, {fd=-1}], 2, -1) = 1 но вернулось оттуда 1, какой-то из дескрипторов сработал. но вот когда nc пытается из сокета что-нибудь прочитать, нифига не читается: read(3, "", 1024) = 0 и что самое интересное - когда потом сокет закрывается от чтения, он уже отвалился: shutdown(3, 0 /* receive */) = -1 ENOTCONN (Transport endpoint is not connected) фигня какая-то. у меня соответствующий кусок выглядит так: Код:
read(0, "GET cache_object://127.0.0.1/inf"..., 8192) = 47 write(3, "GET cache_object://127.0.0.1/inf"..., 47) = 47 select(4, [0 3], NULL, NULL, NULL) = 1 (in [0]) read(0, "", 8192) = 0 close(0) = 0 select(4, [3], NULL, NULL, NULL) = 1 (in [3]) read(3, "HTTP/1.0 200 OK\r\nServer: squid/2"..., 8192) = 2830 write(1, "HTTP/1.0 200 OK\r\nServer: squid/2"..., 2830) = 2830 select(4, [3], NULL, NULL, NULL) = 1 (in [3]) read(3, "", 8192) = 0 close(3) = 0 close(3) = -1 EBADF (Bad file descriptor)
__________________
Ой, девоньки, вот всё, про что вы говорите — так у меня то же самое, только в сто раз больше! |
![]() |
![]() |
![]() |
#11 |
Заслуженный Участник
|
![]()
федора 8.
странно что нс работает нормально когда я ручками ему скармливаю запрос
__________________
Lies, damn lies, and statistics. |
![]() |
![]() |
![]() |
#12 |
Practical UNIX Terrorist
|
![]()
самое интересное здесь вот что: после закрытия сокета на запись (shutdown(3, 1)) он продолжает поллиться на POLLHUP, что не есть правильно. есть мнение, что второй раз срабатывает как раз POLLHUP.
в changelog'е нетката я вижу фикс, хотя и давний. сделай nc -h и скажи какая у тебя версия нетката. а ещё лучше дай вывод rpm -q --whatprovides /usr/bin/nc
__________________
Even if a billion people believe something it can still be ridiculous. |
![]() |
![]() |
![]() |
#13 | |
Заслуженный Участник
|
![]() Цитата:
соответственно, в первом poll сработал дескриптор 0 (revents=POLLHUP), что логично - stdin кончился, а во втором единственно возможный сокет (fd=3), причем у него случилось сразу POLLIN|POLLHUP. но почему read не смог прочитать пришедшие данные - не понимаю. принципиальная разница в том, что при скармливании ручками stdin не заканчивается после ввода строки, а при echo заканчивается но как это влияет на чтение из сокета - ума не приложу мне гораздо интереснее, почему у меня никаких poll'ов вообще нет, одни select'ы. nc v1.10-38
__________________
Ой, девоньки, вот всё, про что вы говорите — так у меня то же самое, только в сто раз больше! Последний раз редактировалось Troll, 03.04.2009 в 17:04. |
|
![]() |
![]() |
Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок |
![]() |
#14 |
Practical UNIX Terrorist
|
![]()
Troll, да, ты прав.
а вот такое предположение - может сквид паникует и когда видит аналог POLLHUP на своей стороне (поскольку мы закрыли коннект), просто дропает его, не отвечая? потому что у себя на 9-й федоре я вижу аналогичное поведение - после revents=POLLIN|POLLHUP read() возвращает 0. то есть POLLIN|POLLHUP это ядро говорит что сокет закрыт с той стороны, нифига там больше нет. конечно, у меня разница в том что перед этим есть 2 полноценных revents=POLLIN и один POLLIN|POLLHUP с остатками ответа. может виноват сквид? как насчёт параллельного tcpdump -n -i lo -X -s 16384 port 8083? показывает что-нибудь? Troll, что касается select/poll - у тебя что за система? 1.10 - это старый неткат, м.б. он тогда ещё юзал селект? UPD: да, неткат перешёл с селекта на полл в версии 1.21. 8 лет назад. пора тебе апгрейдиться ![]() netcat.c 1.20 vs 1.21
__________________
Even if a billion people believe something it can still be ridiculous. Последний раз редактировалось rojer, 03.04.2009 в 17:40. |
![]() |
![]() |
![]() |
#15 | |
Заслуженный Участник
|
![]() Цитата:
убунта 8.10 с последними апдейтами. natcat 1.10 - последний имеющийся оригинальный, он с 1996 года и не менялся. 1.21 - это отдельный OpenBSD'шный форк, он в дебиане отдельным пакетом идет - netcat-openbsd.
__________________
Ой, девоньки, вот всё, про что вы говорите — так у меня то же самое, только в сто раз больше! Последний раз редактировалось Troll, 03.04.2009 в 19:08. |
|
![]() |
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщ. |
bash history | AlexM | IT и Связь | 14 | 27.11.2006 18:56 |
bash.org | Mikhael | Само приползло | 2 | 02.04.2006 22:35 |