Вход/Регистрация
TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)
вернуться

Фейт Сидни М.

Шрифт:

* Сообщение отправляется, и распечатывается последняя строка. */

 printf ("CLIENT: Готов к пересылке\n");

 if (send(sock, argv[3], strlen(argv[3]), 0) < 0) {

(perror("Проблемы с пересылкой.\n");

exit(1);

 }

 printf ("CLIENT: Пересылка завершена. Счастливо оставаться.\n");

 close(sock);

 exit(0);

}

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 для закрытия соединения.

21.8 Более простой сервер

Многие серверы разрабатываются как в показанном выше примере. Однако можно использовать более упрощенную модель, когда сервер должен выполнять только простые запросы клиента (см. ниже).

Вместо создания дочернего процесса для каждого клиента сервер может непосредственно выполнять запрос, а затем закрывать соединение. Очередь сервера позволяет нескольким другим клиентам ожидать, пока он не будет готов обработать их запросы.

Ниже приведен листинг для более простого сервера. К этому серверу клиенты также могут обращаться через рассмотренную выше программу tcpclient.

/* tcpsimp.c

* Для запуска программ ввести "tcpsimp" */

/* Сначала включить стандартные заголовочные файлы. */

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <netinet/in.h>

#include <netdb.h>

#include <errno.h>

main {

  • Читать дальше
  • 1
  • ...
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: