Вызов функции close() применительно к сокетам выполняется точно так же, как и для обычных дескрипторов файлов. Сокет прекращает свою работу. После закрытия сокета с его помощью больше нельзя выполнять чтение или запись. При успешном выполнении функция close() возвращает истинное значение. В ином случае она возвращает значение undef и оставляет сообщение об ошибке в переменной $!.
Последствия вызова функции close() для другого конца соединения аналогичны последствиям, полученным в результате закрытия канала. После закрытия сокета любые последующие попытки чтения сокета на другом конце соединение приводят к получению сообщения о возникновении условия конца файла (EOF). Любые дальнейшие попытки записи приводят к возникновению исключения pipe.
Функция shutdown() - это более тонкая версия close(), которая позволяет управлять тем, какая часть двунаправленного соединения должна быть закрыта. Первым параметром является подключенный сокет. Второй параметр, $how — это небольшое целое число, которое указывает, какое соединение должно быть закрыто. При значении $how, равном 0, сокет закрывается для дальнейшего чтения, при значении 1 он закрывается для записи, а при значении 2 — закрывается для чтения, и для записи (как при вызове функции close()).
Эхо-сервер TCP.
Теперь рассмотрим простой сервер TCP. В отличие от клиента TCP, сервер обычно не вызывает функцию connect(). Работа сервера TCP сводится в основном к следующему.
Создание сокета. Этот этап аналогичен соответствующему этапу работы клиентской программы.