hirthwork 29.05.2012 08:48 mcabberAC57D0EA

как известно, если долго не писать в сокет, то он протухает
дык вот, напомните мне, я правильно помню, что в протухший сокет можно будет
записать некоторое количество данных (до забивания буфера), но нельзя будет
прочесть реплай, который должен прислать сервер.
или же в протухший сокет может даже запись пофейлиться?

1. hongweibing 29.05.2012 08:48 Psi4865E04F

а как ведёт себя протухший сокет?

2. hirthworkhongweibing /1 29.05.2012 08:49 mcabberAC57D0EA

неправильно. судя по коду который я когда-то давно написал — так как я описал в /0. интересуют другие варианты его поведения

3. gelraen 29.05.2012 08:49 imax

ядро может не знать что он протух на удалённой стороне, потому запись вполне может быть успешной, а после прихода RST уже всё будет фейлиться

4. hirthworkgelraen /3 29.05.2012 08:51 mcabberAC57D0EA

но RST просто так придти не сможет. его нужно инициировать. вот и вопрос, пофейлится за запись в сокет блока данных большего чем MTU

5. gelraenhirthwork /4 29.05.2012 08:52 imax

он придёт после первого посланного пакета. сколько payload будет в пакете зависит от того, сколько ты байтиков скормил write(2)/send(2)

6. gelraenhirthwork /4 29.05.2012 08:53 imax

а пофейлится ли на записи блока большего чем MSS — скорее всего нет, копировать данные из userspace кусочками и ждать перед возвратом из syscall пока пакеты будут отправлены глупо

7. hirthworkgelraen /6 29.05.2012 08:56 mcabberAC57D0EA

тащем-та я понимаю, что может не пофейлиться. меня интересует сама возможность фейла при записи в протухший сокет. скорее всего при записи гигабайтного блока, таки фейл произойдёт

8. gelraenhirthwork /7 29.05.2012 17:14

ну да, при записи блока большего чем размер окна write(2) таки заблокируется пока удалённая сторона не ответит ACK (конечно, если сокет не переведён в неблокирующий режим). А поскольку она вернёт RST — то возвратит ошибку.

Do you really want to delete ?