hirthwork
29.05.2012 08:48 mcabberAC57D0EA
как известно, если долго не писать в сокет, то он протухает
дык вот, напомните мне, я правильно помню, что в протухший сокет можно будет
записать некоторое количество данных (до забивания буфера), но нельзя будет
прочесть реплай, который должен прислать сервер.
или же в протухший сокет может даже запись пофейлиться?
а как ведёт себя протухший сокет?
неправильно. судя по коду который я когда-то давно написал — так как я описал в /0. интересуют другие варианты его поведения
ядро может не знать что он протух на удалённой стороне, потому запись вполне может быть успешной, а после прихода RST уже всё будет фейлиться
но RST просто так придти не сможет. его нужно инициировать. вот и вопрос, пофейлится за запись в сокет блока данных большего чем MTU
он придёт после первого посланного пакета. сколько payload будет в пакете зависит от того, сколько ты байтиков скормил write(2)/send(2)
а пофейлится ли на записи блока большего чем MSS — скорее всего нет, копировать данные из userspace кусочками и ждать перед возвратом из syscall пока пакеты будут отправлены глупо
тащем-та я понимаю, что может не пофейлиться. меня интересует сама возможность фейла при записи в протухший сокет. скорее всего при записи гигабайтного блока, таки фейл произойдёт
ну да, при записи блока большего чем размер окна write(2) таки заблокируется пока удалённая сторона не ответит ACK (конечно, если сокет не переведён в неблокирующий режим). А поскольку она вернёт RST — то возвратит ошибку.