Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сети.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.51 Mб
Скачать

13.4 Internet-Domain сокеты

 Cокеты UNIX-domain использоваться только для взаимодействия двух процессов только на одном компьютере. Сокеты Internet, используются для соединения нескольких процессов на различных машинах, подключенных к сети.

 

 Для соединения процессов через Интернет сокеты используют пространство имен Интернет указываемое с помощью  PF_INET . Большинство протоколов являются  TCP/IP . Интернет протокол ( IP), протокол нижнего уровня, отправляет пакеты через Интернет, разбивая на меньшие пакеты, в случае необходимости. Он гарантирует только доставку "лучшего усилия", так что пакеты могут быть потеряны или переупорядочены во время транспортировки. Каждый компьютер имеет  IP адрес. Протокол управления передачей ( TCP ), который следует за  IP  протоколом, обеспечивает надежное подключение. Это позволяет установить между компьютерами соединение, наподобие телефонного и гарантирует доставку данных в правильном порядке.

 

 Интернет адрес сокета состоит из двух частей: номера компьютера и номера порта. Эта информация хранится в переменной структуры  sockaddr_in . Для идентификации того, что это адрес Интернет пространства имен, необходимо установить поле  sin_family в  AF_INET . В поле  Sin_addr  хранится Интернет адрес компьютера, как 32-разрядное целое число  IP . Каждому сокету на одном компьютере присваивается номер порта. Поскольку различные машины сохраняют многобайтовые значения в различном порядке байта, используют  htons , чтобы преобразовать число порта к сетевому порядку байтов.

 

 Команда gethostbyname преобразовывает удобочитаемые имена хоста, числа со стандартной точечной нотацией (типа 10.0.0.1) или  DNS имена (такие как www.codesourcery.com) в 32-разрядные IP адреса. В качестве результата возвращается указатель на структуру  struct hostent ; в поле  h_addr хранится IP адрес главного компьютера.

 

 Листинг 13.3 иллюстрирует использование Internet-domain сокетов. Программа получает домашнюю страницу от Web сервера, имя хоста которого определено в командной строке.

 

 Листинг 13.3  (socket-inet.c)

         #include <stdlib.h>

         #include <stdio.h>

         #include <netinet/in.h>

         #include <netdb.h>

         #include <sys/socket.h>

         #include <unistd.h>

         #include <string.h>

         /* Печать содержимого домашней страницы.

          * В качестве результата передать флаг успешного завершения процесса.*/

         void get_home_page (int socket_fd)

         {

                   char buffer[10000];

                   ssize_t number_characters_read;

                   /* Передать команду HTTP GET для домашней страницы */

                   sprintf (buffer, "GET /\n");

                   write (socket_fd, buffer, strlen (buffer));

                   /* Читать данные из сокета. Не все данные могут быть возвращены одновременно,

                    * продолжать попытку до завершения процесса */

                   while (1) {

                            number_characters_read = read (socket_fd, buffer, 10000);

                            if (number_characters_read == 0)

                                      return;

                            /* Записать данные в стандартный вывод */

                            fwrite (buffer, sizeof (char), number_characters_read, stdout);

                   }

         }

         int main (int argc, char* const argv[])

         {

                   int socket_fd;

                   struct sockaddr_in name;

                   struct hostent* hostinfo;

                   /* Создать сокет */

                   socket_fd = socket (PF_INET, SOCK_STREAM, 0);

                   /* Сохранить адрес сервера в адрессе сокета */

                   name.sin_family = AF_INET;

                   /* Преобразовать строку в число */

                   hostinfo = gethostbyname (argv[1]);

                   if (hostinfo == NULL)

                            return 1;

                   else

                            name.sin_addr = *((struct in_addr *) hostinfo->h_addr);

                   /* Web сервер использует 80 порт */

                   name.sin_port = htons (80);

                  /* Установить соединение с Web сервером */

                   if (connect (socket_fd, &name, sizeof (struct sockaddr_in)) == -1) {

                            perror ("connect");

                            return 1;

                   }

                   /* Получить домашнюю страницу */

                   get_home_page (socket_fd);

                   return 0;

         }

 

 Имя хоста Web сервера задается в командно строке (без "http: //"). Команда  gethostbyname  преобразовывает имя хоста в числовой IP адрес и затем подключает поток (TCP) сокета к порту 80 на главном компьютере. Серверы используют Гипертекстовый Транспортный Протокол ( HTTP ), поэтому передается команда  HTTP GET , сервер в качестве ответа передает текст домашней страницы.

 

 Для отображения страницы www.codesourcery.com, необходимо задать следующую команду

         % ./socket-inet www.codesourcery.com

         <html>

         <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

         ...