

15. Программирование в режиме TCP-соединения
Программирование в режиме TCP-соединения
План реализации серверного процесса выглядит следующим образом.
- установить абонентскую точку сокета;
- связывание адреса сервера с сокетом;
- ожидание подключения;
- установка соединения;
- создание дочернего процесса для работы с соединением;
- дочерний процесс в цикле принимает данные от клиента и посылает ему ответы.
План клиентского процесса.
- создать сокет;
- соединить сокет с адресом серверного процесса;
- в цикле посылать данные серверу и получать от него ответы.
Для установления сокета используется вызов socket.
Системный вызов bind связывает сетевой адрес компьютера с идентификатором сокета.
После выполнения связывания с адресом и перед тем, как какой-либо клиент сможет подключиться к созданному сокету, сервер должен включить прием соединений. Для этого служит вызов listen.
Когда сервер получает от клиента запрос на соединение, он должен создать новый сокет для работы с новым соединением. Первый же сокет используется только для установки соединения. Дополнительный сокет создается при помощи вызова accept, принимающего очередное соединение.
Для выполнения запроса на подключение к серверному процессу клиент использует системный вызов connect.
При работе с сокетами важно корректно реагировать на завершение работы абонентского процесса. Так как сокет является двусторонним механизмом связи, то нельзя предсказать заранее, когда произойдет разрыв соединения - во время чтения или записи. Поэтому нужно учитывать оба возможных варианта.
Если процесс пытается записать данные в оборванный сокет при помощи вызова write или send, то он получит сигнал SIGPIPE, который может быть перехвачен соответствующим обработчиком сигнала. При чтении обрыв диагностируется проще.
Закрываются сокеты так же, как и обычные дескрипторы файлового ввода/вывода, при помощи системного вызова close. Для сокета типа SOCK_STREAM ядро гарантирует, что все записанные в сокет данные будут переданы принимающему процессу. Это может вызвать блокирование операции закрытия сокета до тех пор, пока данные не будут доставлены. Если сокет имеет тип SOCK_DGRAM, то сокет закрывается немедленно.