Правильно закройте сокет TCP - PullRequest
10 голосов
/ 16 января 2012

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

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

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

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

1 Ответ

20 голосов
/ 16 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...