закрывает
8.
…
close(sockClient);
Вызов
длина_сообщения = recv(дескриптор_socket, буфер, длина_буфера, флаги)
По умолчанию вызов
После получения данных дочерним процессом и вывода сообщения на печать, доступ к
21.7 Клиентская программа TCP
Клиент соединяется с сервером, посылает одно сообщение, и далее работа программы завершается (фрагменты программы рассматриваются в следующем разделе). Для запуска программы конечный пользователь должен ввести имя хоста сервера, номер порта и сообщение, которое будет послано на этот сервер. Например:
tcpclient pltim.cs.yale.edu 1356 hello
/* tcpclient.с
* Перед запуском клиента должен быть запущен сервер. Производится
* поиск порта сервера. Для запуска клиента нужно ввести:
* tcpclient имя_хоста порт сообщение */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
main(argc, argv) /* Клиентская программа имеет входные аргументы. */
int argc;
char* argv[];
{
int sock;
struct sockaddr_in servAddr;
struct hostent *hp, *gethostbyname();
/* Аргументами будут 0:имя_программы, 1:имя_хоста, 2:порт, 3:сообщение */
if (argc < 4)
{
printf('ВВЕСТИ tcpclient имя_хоста порт сообщение
');
exit(1);
}
/* 1. Создание TCB. */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror('He могу получить socket
');
exit(1);
}
/* 2. Заполнить поля адреса и порта сервера в servAddr.
* Сначала заполнить нулями адресную структуру. Затем получить IP-адрес
* для данного имени хоста и ввести его в адресную структуру.
* Наконец ввести номер порта, взяв его из argv[2]. */
bzero((char *)&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
hp = gethostbyname (argv[1]);
bcopy(hp->h_addr, &servAddr.sin_addr, hp->h_length);
servAddr.sin_port = htons(atoi(argv[2]));
/* 3. Соединиться с сервером. Вызывать bind не нужно.
* Система присвоит свободный порт во время выполнения соединения. */
if (connect (sock, &servAddr, sizeof(servAddr)) < 0) {
perror('Клиент не может соединиться.
');
exit(1);
}
/* 4. Клиент анонсирует свою готовность послать сообщение.
* Сообщение отправляется, и распечатывается последняя строка. */
printf ('CLIENT: Готов к пересылке
');
if (send(sock, argv[3], strlen(argv[3]), 0) < 0) {
(perror('Проблемы с пересылкой.
');
exit(1);
}
printf ('CLIENT: Пересылка завершена. Счастливо оставаться.
');
close(sock);
exit(0);
}
21.7.1 Вызовы в клиентской программе TCP
1.
Клиент создает блок управления пересылкой ('socket') так же, как это делал сервер.
2. Сервер должен инициализировать адресную структуру для использования в
Эта структура содержит локальный IP-адрес и номер порта сервера. Клиент также инициализирует адресную структуру, хранящую те же сведения. Эта структура будет использоваться в вызове
Вызов
Затем нужно преобразовать введенное пользователем имя хоста в IP-адрес. Это делает функция