Правильно закрыть TCP-сокет

Каков рекомендуемый способ "изящно" закрыть TCP-сокет?

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

Что было бы хорошим подходом, чтобы избежать этой ситуации? Есть ли способ рассказать API о том, что мне не все равно, что данные теряются из-за того, что я игнорирую любые оставшиеся буферизованные данные и закрывая сокет?

Или мне нужно рассмотреть проблему на уровне протокола приложения и использовать какой-то неявный или явный сигнал "конец передачи", чтобы другая сторона узнала, что безопасно закрыть сокет для чтения?

Ответ 1

1) Вызовите shutdown, чтобы указать, что вы больше не будете записывать данные в сокет.

2) Продолжайте до read из сокета, пока не получите либо ошибку, либо соединение закрыто.

3) Теперь close сокет.

Если вы этого не сделаете, вы можете завершить закрытие соединения, пока есть еще данные для чтения. Это приведет к несправедливому закрытию.