Книга: TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)
21.7.1 Вызовы в клиентской программе TCP
21.7.1 Вызовы в клиентской программе TCP
1. sock = socket(AF_INET, SOCK_STREAM, 0);
Клиент создает блок управления пересылкой ("socket") так же, как это делал сервер.
2. Сервер должен инициализировать адресную структуру для использования в bind.
Эта структура содержит локальный IP-адрес и номер порта сервера. Клиент также инициализирует адресную структуру, хранящую те же сведения. Эта структура будет использоваться в вызове connect для указания точки назначения.
Вызов bzero() помещает нули в servAddr — адресную структуру сервера. Еще раз мы трактуем семейство адресов как Интернет.
Затем нужно преобразовать введенное пользователем имя хоста в IP-адрес. Это делает функция gethostbyname, которая возвращает указатель на структуру hostent, содержащую имя сервера и IP-адрес.
Функция bcopy применяется для копирования IP-адреса (который находится в hp->h_addr) в servAddr.
Второй введенный конечным пользователем аргумент определял порт сервера. Он читался как текстовая строка ASCII, поэтому ее сначала нужно преобразовать в целое число через atoi(), а затем изменить порядок следования байт через htons(). Наконец номер порта копируется в адресную переменную из servAddr.
bzero((char *)&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
hp = gethostbyname(argv[i]);
bcopy(hp->h_addr, &servAddr.sin_addr, hp->h_length);
servAddr.sin_port = htons(atoi(argv[2]));
3. connect(sock, &servAddr, sizeof(servAddr)); Вызов connect имеет форму:
connect(дескриптор_socket, адресная_структура, длина_адресной_структуры)
Клиент откроет соединение с сервером, IP-адрес и порт которого хранятся в адресной структуре.
4. send (sock, argv[3], strlen(argvs[3]), 0); Вызов send имеет форму:
возвращаемый_код = send(дескриптор_socket, буфер, длина_буфера, флаги)
Отметим, что введенный конечным пользователем третий аргумент (который появляется в программе как argv[3]) — это текст отправляемого сообщения. Обычно флаги используются для сообщения о срочных данных. В нашем случае параметры флагов установлены в 0.
5. close(sock);
Клиент выполняет close для закрытия соединения.