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 адрес главного компьютера.
Листинг 5.12 иллюстрирует использование Internet-domain сокетов. Программа получает домашнюю страницу от Web сервера, имя хоста которого определено в командной строке.
Листинг 5.12(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, необходимо задать следующуе команду