Size: a a a

2020 July 02

AP

Anton Petrusevich in Modern::Perl
проблема в тцп, а не в перле. когда такой обрыв связи, то в протоколе огромные таймауты, чтобы это понять. сенд будет работать до тех пор, пока не забьются буфера ядра на отправку.
источник

AP

Anton Petrusevich in Modern::Perl
рид должен вернуть ноль, когда сокет закрыт и ошибку (андеф) при ошибке соединения, но для этого ядро должно пометить это соединение как уже недействительное
источник

AP

Anton Petrusevich in Modern::Perl
для решения подобной проблемы многие протоколы предусматривают "heartbeat" "пинги" (специальные пакеты определяемые в протоколе передачи, вовсе не ICMP), которые если вдруг не приходят после относительно короткого таймаута, то приложение самостоятельно решает закрыть сокет, не полагаясь на ОС. как пример — вебсокеты, там дефолтный пинг каждые 30 секунд и если через 60 не было ни одного пинга, то соединение закрывается.
источник

b

basiliscos in Modern::Perl
Anton Petrusevich
для решения подобной проблемы многие протоколы предусматривают "heartbeat" "пинги" (специальные пакеты определяемые в протоколе передачи, вовсе не ICMP), которые если вдруг не приходят после относительно короткого таймаута, то приложение самостоятельно решает закрыть сокет, не полагаясь на ОС. как пример — вебсокеты, там дефолтный пинг каждые 30 секунд и если через 60 не было ни одного пинга, то соединение закрывается.
это другая проблема. Т.е. если удалённый конец просто "выдернули из сети", то да, он как /dev/null ведёт себя и надо решать описанным тобой способом. А вот локальное отключение интерфейса, афаик, к ошибкам должно приводить (как при чтении), и если я прав, локально с таймауты не особо нужны для этого случая.
источник

b

basiliscos in Modern::Perl
> как пример — вебсокеты, там дефолтный пинг каждые 30 секунд и если через 60 не было ни одного пинга

а вот про это поподробней, плз. Это по рфц как-то?
источник

AP

Anton Petrusevich in Modern::Perl
а в чём разница? он же вырубает вайфай физически, как я понял, рутер просто продолжает ждать, что он появится, тцп не в курсе пропажи, просто тупо копит таймауты, которые там ахренеть какие
источник

AP

Anton Petrusevich in Modern::Perl
basiliscos
> как пример — вебсокеты, там дефолтный пинг каждые 30 секунд и если через 60 не было ни одного пинга

а вот про это поподробней, плз. Это по рфц как-то?
в рфц, насколько я помню, описаны пинги, но не конкретные таймауты. конкретные таймауты — это мои замеры и такое же мнение vti
источник

AP

Anton Petrusevich in Modern::Perl
где-то тут про пинг-понг вебсокетов: https://tools.ietf.org/html/rfc6455#page-37
источник

AP

Anton Petrusevich in Modern::Perl
я когда сначала сделал поддержку вебсокетов, не сдела пинг-понг. и удивлялся, чего это браузер соединение просто так закрывает
источник

b

basiliscos in Modern::Perl
Anton Petrusevich
в рфц, насколько я помню, описаны пинги, но не конкретные таймауты. конкретные таймауты — это мои замеры и такое же мнение vti
>    NOTE: A Ping frame may serve either as a keepalive or as a means to
  verify that the remote endpoint is still responsive.

можно использовать для детекта, но вовсе не обязательно.
источник

AP

Anton Petrusevich in Modern::Perl
basiliscos
>    NOTE: A Ping frame may serve either as a keepalive or as a means to
  verify that the remote endpoint is still responsive.

можно использовать для детекта, но вовсе не обязательно.
я тебе практику говорю. делаешь вебсокет сервер, коннектишь к нему браузер и не шлёшь пинги — через 60 сек соединение закрывается браузером
источник

b

basiliscos in Modern::Perl
Anton Petrusevich
а в чём разница? он же вырубает вайфай физически, как я понял, рутер просто продолжает ждать, что он появится, тцп не в курсе пропажи, просто тупо копит таймауты, которые там ахренеть какие
а, да, согласен т.к. это удалённое устройство, то да, до ядра только через нек. время дойдёт
источник

b

basiliscos in Modern::Perl
Anton Petrusevich
я тебе практику говорю. делаешь вебсокет сервер, коннектишь к нему браузер и не шлёшь пинги — через 60 сек соединение закрывается браузером
я так понимаю браузер шлёт пинги? ну тогда да, это особенность браузера. В принципе разумно
источник

AP

Anton Petrusevich in Modern::Perl
сервер тоже должен пинги слать. я не помню про браузер сходу, лень идти код смотреть, я помню, что автоматический понг предусмотрел :)
источник

AP

Anton Petrusevich in Modern::Perl
Ping is meant to be sent only from server to client, and browser should answer as soon as possible with Pong OpCode, automatically.
источник

b

basiliscos in Modern::Perl
это откуда?
источник

AP

Anton Petrusevich in Modern::Perl
basiliscos
это откуда?
стековерфлоу, но может быть это мисинформация, там дальше дискуссия...
источник

AP

Anton Petrusevich in Modern::Perl
Venom1 2
рид в блокируещем режиме и с другого конца ничего не шлется
твой случай вот этот:
TCP does not notify of disconnects when RST/FIN packets were not received. TCP only detects dropped connections when a sender attempts to send on a disconnected connection.
источник

AP

Anton Petrusevich in Modern::Perl
basiliscos
это откуда?
но, кстати, я тоже не помню пингов от браузера, просто закрывает соединение, если от сервера давно не было пингов. видимо, чтобы не плодить трафик в обе стороны.
источник

V2

Venom1 2 in Modern::Perl
спасибо большущее
источник