Шрифт:
6. child = fork;
…
close(sockMain);
В языке С команда fork создает новый дочерний процесс, который наследует все дескрипторы ввода/вывода родительской программы, а также имеет доступ к sockMain и sockClient. Операционная система отслеживает количество процессов, имеющих доступ к socket.
Соединение закрывается, когда последний обращающийся к socket процесс вызывает close. Когда дочерний процесс закрывает sockMain, родительский процесс все еще имеет доступ к socket.
7. close(sockClient);
Этот вызов выполняется из родительской части программы. Когда родительский процесс закрывает sockClient, дочерний процесс все еще имеет доступ к socket.
8. msgLength = recv(sockClient, buf, BUFLEN, 0));
…
close(sockClient);
Вызов recv имеет форму:
По умолчанию вызов recv блокированный. Функции fcntl или iocntl позволяют изменить статус socket на неблокированный режим.
После получения данных дочерним процессом и вывода сообщения на печать, доступ к sockClient закрывается. Это заставит соединение перейти в фазу закрытия.
21.7 Клиентская программа TCP
Клиент соединяется с сервером, посылает одно сообщение, и далее работа программы завершается (фрагменты программы рассматриваются в следующем разделе). Для запуска программы конечный пользователь должен ввести имя хоста сервера, номер порта и сообщение, которое будет послано на этот сервер. Например: