shutdown() в линуксе блокирующий? А если на неблокирующем сокете вызвать, будет ли ок? Если не заблокируется, то как отследить его завершение? Конечная цель -- сделать так, чтобы shutdown() не блокировал выполнение треда.
Мучил гугл этими вопросами, ответов не нашёл. Следующим шагом будет "читать исходники ядра", но я хотел бы избежать этого, поэтому, прошу, подскажите.
неблокирующий. если сенд-буффер пустой, то в него будет положен FIN-пакет.
если же сенд-буффер забит до верху, то FIN-флаг будет выставлен у последнего пакета в очереди отправки.
это для сервера. для клиента достаточно выставлять SO_LINGER нулевой
@komar может ещё и детей от меня хочешь?
@komar передумал? #76N07H/WBD
@gds хз. у нас была проблема с тем что воркеры асинхронного сервера долго тупили закрывая каждое соединение. починилось именно выполнением шатдауна вместо закрытия сокета, а само закрытие сокета вынесли в отдельный пул тредов, который ничем полезным не занимался.
@hirthwork с SHUT_WR мы вызываем shutdown(2)
@gds делай. другого выбора нет. алсо, у нас из-за джавы тут ещё один костыль пришлось втыкать: перед закрытием регать сокет в другом селекторе, чтобы сокет закрывался именно в отдельном треде, а не в воркере