Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

Функция

gethostbyname
преобразует адрес компьютера из текстового представления — стандартного точечного (например, 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 может вернуть

не все данные сразу, поэтому продолжаем чтение, пока

не будут получены все данные. */

 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-сервера из командной строки (имя не является 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
), тип взаимодействия и протокол. Последний параметр — это массив из двух целых чисел, куда будут записаны дескрипторы сокетов, подобно функции
pipe
.

Часть II

Секреты Linux

Глава 6

Устройства

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

Опыты

Монтень Мишель
Научно-образовательная:
философия
7.43
рейтинг книги
Опыты

Добыча. Всемирная история борьбы за нефть, деньги и власть

Ергин Дэниел
Документальная литература:
публицистика
5.00
рейтинг книги
Добыча. Всемирная история борьбы за нефть, деньги и власть

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.50
рейтинг книги
Дважды одаренный. Том VI

Воины

Хобб Робин
Фантастика:
фэнтези
7.00
рейтинг книги
Воины

Вечера в древности

Мейлер Норман
Проза:
классическая проза
историческая проза
5.00
рейтинг книги
Вечера в древности

Годы странствий

Чулков Георгий Иванович
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Годы странствий

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

12

Санивский Сергей Анатолиевич
5.00
рейтинг книги
12

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Месть Седьмой

Лор Питтакус
5. Наследие Лориена
Фантастика:
фэнтези
9.05
рейтинг книги
Месть Седьмой

Солнечная система (Астрономия и астрофизика)

Сурдин Владимир Георгиевич
Научно-образовательная:
прочая научная литература
астрономия и космос
5.00
рейтинг книги
Солнечная система (Астрономия и астрофизика)

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
6.25
рейтинг книги
Газлайтер. Том 19

Законы Рода. Том 5

Мельник Андрей
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Техники ландшафтной арт-терапии

Копытин Александр Иванович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Техники ландшафтной арт-терапии