2013-05-01 4 views
0

Итак, представьте ситуацию, когда клиент читает из сокета и читает возвращает 0. Это означает EOF или что сервер закрыл соединение.Нужно ли клиенту закрывать соединение, когда сервер закрывает соединение

Должен ли клиент также позвонить в этот дескриптор файла? Если клиент не вызывает закрытие, это приводит к утечке дескриптора файла?

ответ

1

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

Вы все еще можете обратиться к гнезду (называйте различные методы на нем в том числе read(), даже если само соединение закрывается. После вызова close() ручки полностью ушло, так называют методы, более вероятно, вызовет ошибку сегментации, чем просто возвращая 0.

чтобы быть ясным. Вызов close() имеет два действия.

  1. Он посылает apropriate пакет (ы), чтобы сказать, что удаленный хост сокет закрыт.
  2. Он очищает associ памяти ел с этим гнездом.

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

+0

Итак, в ядре есть какое-то состояние в ядре, которое все еще сохраняется на клиенте, когда сервер закрывает соединение. Итак, когда клиент называет закрытие, FIN отправляется на сервер? Если да, то даже серверу необходимо сохранить какое-то состояние для этого tcp-соединения, пока клиент не закроет его. – 0xhacker

+0

Да, если сокет был уничтожен, когда удаленный хост закрыл соединение, последующие вызовы попросят ОС для чего-то, чего не существует, и приведет к сбою приложения. Таким образом, «socket» должен существовать до тех пор, пока локальное приложение не вызовет 'close()', даже если соединение исчезло. Соединение существует до тех пор, пока локальное приложение или удаленное приложение не вызовет 'close()' или какой-то другой тайм-аут. –

+0

Использование закрытого сокета * возвращает код ошибки. * Он не вызывает нарушения сегментации или сбоя программы. – EJP

Смежные вопросы