Данной функции нужно передать всего один параметр — дескриптор сокета.
Однако вызов close использовать не рекомендуется из-за специфики его работы: он закрывает сокет грубо, не дожидаясь завершения передачи данных. В результате использования close вероятность повреждения принимаемых или передаваемых данных очень высока. В принципе, использовать close можно на клиенте, но на сервере это недопустимо: сначала нужно использовать shutdown, а потом уже close.
Вызов shutdown используется для завершения
сеанса связи, при этом еще не переданные данные будут переданы другой стороне. Прототип функции:
extern int shutdown(int __fd, int __how) __THROW;
Первый параметр — это дескриптор сокета, а второй может принимать одно из трех значений:
♦ SHUT_RD (или 0) — передать данные, которые еще не переданы, но их отправка уже началась, и больше не принимать данные для чтения.
♦ SHUT_WR (или 1) — передать данные и запретить прием данных через сокет.
♦ SHUT_RDWR (или 2) — передать данные и запретить вообще обмен через сокет — ни приема, ни передачи.
27.3.7. Программа-сервер
В этом пункте мы напишем две программы — сервер и клиент. Программа-сервер после запуска сразу же перейдет в режим ожидания («прослушивания») новых клиентов. Максимальное количество клиентов —3. Как только подключится клиент, сервер отправит ему сообщение «What is your name?», в ответ на которое клиент передаст свое имя — «Denis». Сервер прочитает переданную клиентом информацию и выведет ее на консоль. Клиент, в свою очередь, выведет на консоль запрос сервера.
С целью упрощения исходного кода как сервера, так и клиента, обработку ошибок производить не будем, поэтому будьте готовы к тому, что ваш клиент выдаст сообщение Segmentation fault в ответ на неверно заданные параметры. Я рекомендую в качестве имени сервера использовать
localhost
и обе программы запускать на одном компьютере — это же только демонстрация.
разберемся, что есть что. Сначала мы определяем некоторые макросы: номер порта, который будет прослушивать сервер, размер буфера передаваемых данных и текст запроса клиенту.