преобразует адрес компьютера из текстового представления — стандартного точечного (например, 10.10.10.1) или доменного (например,
www.codesourcery.com
) — во внутреннее 32-разрядное. Функция возвращает указатель на структуру типа
hostent
. IP-адрес находится в ее поле
h_addr
.
Программа, представленная в листинге 5.12, иллюстрирует работу с Internet-сокетами. Программа запрашивает начальную страницу у Web-сервера, адрес которого указан в командной строке.
Листинг 5.12. (socket-inet.c)
Чтение страницы с Web-сервера
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
/* Отображение содержимого Web-страницы, полученной из
серверного сокета. */
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));
/* Чтение данных из сокета. Функция read может вернуть
не все данные сразу, поэтому продолжаем чтение, пока
Программа извлекает имя Web-сервера из командной строки (имя не является URL-адресом, т.е. в нем отсутствует префикс
http://
). Далее вызывается функция
gethostbyname
, которая преобразует имя сервера в числовое представление. После этого программа подключает потоковый (TCP) сокет к порту 80 сервера. Web-серверы общаются по протоколу HTTP (Hypertext Transfer Protocol), поэтому программа посылает HTTP-команду GET, в ответ на которую сервер возвращает текст начальной страницы.
Стандартные номера портов
По существующему соглашению Web-серверы ожидают поступления запросов на порт 80. За большинством lntemet-сервисов закреплены стандартные номера портов. Например, защищенные Web-серверы работающие по протоколу SSL. прослушивают порт 443 а почтовые серверы (протокол SMTP) прослушивают порт 25
В Linux связи между именами протоколов/сервисов и номерами портов устанавливаются в файле
/etc/services
. В первой колонке файла указано имя протокола или сервисе. Во второй колонке приведен номер порта и тип взаимодействия:
tcp
— для сервисов ориентированных на соединения, и
udp
— для дейтаграмм.
При реализации собственных сетевых сервисов используйте номере портов, большие чем 1024
Например, чтобы получить начальную страницу с сервера
www.codesourcery.com
, введите следующую команду:
% ./socket-inet www.codesourcery.com
<html>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
...
5.5.7. Пары сокетов
Как было показано выше, функция
pipe
создает два дескриптора для входного и выходного концов канала. Возможности каналов ограничены, так как с файловыми дескрипторами должны работать связанные процессы и данные через канал передаются только в одном направлении. Функция
socketpair
создает два дескриптора для двух связанных сокетов, находящихся на одном компьютере. С помощью этих дескрипторов можно организовать двунаправленное взаимодействие процессов.
Первые три параметра функции
socketpair
такие же, как и в функции
socket
: пространство имен (должно быть
PF_LOCAL
), тип взаимодействия и протокол. Последний параметр — это массив из двух целых чисел, куда будут записаны дескрипторы сокетов, подобно функции