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

на главную

Жанры

Основы программирования в Linux
Шрифт:

Функция преобразует адрес интернет-узла в строку формата четверки чисел с точками. В случае ошибки она возвращает -1, но в стандарте POSIX не определены конкретные ошибки. Еще одна новая функция, которую вы примените, —

gethostname
:

#include <unistd.h>

int gethostname(char *name, int name length);

Эта функция записывает имя текущего узла в строку, заданную параметром

name
. Имя узла будет нуль-терминированной строкой. Аргумент
namelength
содержит длину строкового имени и, если возвращаемое имя узла превысит эту длину, оно будет обрезано. Функция
gethostname
возвращает 0 в случае успешного завершения и -1 в случае ошибки. И снова ошибки в стандарте POSIX не определены.

Выполните упражнение 15.5.

Упражнение 15.5. Сетевая информация

Данная программа getname.c получает сведения о компьютере.

1. Как обычно, вставьте соответствующие заголовочные файлы и объявите переменные:

#include <netinet/in.h>

#include <arpa/inet.h>

#include <unistd.h>

#include <netdb.h>

#include <stdio.h>

#include <stdlib.h>

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

 char *host, **names, **addrs;

 struct hostent *hostinfo;

2. Присвойте переменной

host
значение аргумента, предоставляемого при вызове программы
getname
, или по умолчанию имя машины пользователя:

 if (argc == 1) {

char myname[256];

gethostname(myname, 255);

host = myname;

 } else host = argv[1];

3. Вызовите функцию gethostbyname и сообщите об ошибке, если никакая информация не найдена:

 hostinfo = gethostbyname(host);

 if (!hostinfo) {

fprintf(stderr, "cannot get info for host: %s\n", host);

exit(1);

 }

4. Отобразите имя узла и любые псевдонимы, которые у него могут быть:

 printf("results for host %s:\n", host);

 printf("Name : %s\n", hostinfo->h_name);

 printf("Aliases: ");

 names = hostinfo->h_aliases;

 while (*names) {

printf(" %s", *names); names++;

 }

 printf("\n");

5. Если запрашиваемый узел не является IP-узлом, сообщите об этом и завершите выполнение:

 if (hostinfo->h_addrtype != AF_INET) {

fprintf(stderr, "not an IP host!\n");

exit(1);

 }

6. В противном случае выведите IP-адрес (адреса):

 addrs = hostinfo->h_addr_list;

 while (*addrs) {

printf(" %s", inet_ntoa(*(struct in_addr*)*addrs));

addrs++;

 }

 printf("\n");

 exit(0);

}

Для

определения узла по заданному IP-адресу можно применить функцию
gethostbyaddr
. Вы можете использовать ее на сервере для того, чтобы выяснить, откуда клиент запрашивает соединение.

Как это работает

Программа getname вызывает функцию gethostbyname для извлечения сведений об узле из базы данных сетевых узлов. Она выводит имя компьютера, его псевдонимы (другие имена, под которыми известен компьютер) и IP-адреса, которые он использует в своих сетевых интерфейсах. На одной из машин авторов выполнение примера и указание в качестве аргумента имени tilde привело к выводу двух интерфейсов: сети Ethernet и модемной линии связи.

$ ./getname tilde

results for host tilde:

Name: tilde.localnet

Aliases: tilde

192.168.1.1 158.152.x.x

Когда используется имя узла

localhost
, задается виртуальная сеть:

$ ./getname localhost

results for host localhost:

Name: localhost

Aliases: 127.0.0.1

Теперь вы можете изменить свою программу-клиента для соединения с любым именованным узлом сети. Вместо подключения к серверу из вашего примера, вы соединитесь со стандартным сервисом и сможете извлечь номер порта.

Большинство систем UNIX и некоторые ОС Linux делают доступными свои системные время и дату в виде стандартного сервиса с именем

daytime
. Клиенты могут подключаться к этому сервису для выяснения мнения сервера о текущих времени и дате. В упражнении 15:6 приведена программа-клиент getdate.c, именно это и делающая.

Упражнение 15.6. Подключение к стандартному сервису

1. Начните с обычных директив

#include
и объявлений:

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

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

 char *host;

 int sockfd;

 int len, result;

 struct sockaddr_in address;

 struct hostent *hostinfo;

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

Гулящие люди

Чапыгин Алексей Павлович
Проза:
историческая проза
6.25
рейтинг книги
Гулящие люди

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.25
рейтинг книги
Дитя прибоя

Тамерлан. Завоеватель мира

Мароцци Джастин
Историческая библиотека
Научно-образовательная:
история
5.00
рейтинг книги
Тамерлан. Завоеватель мира

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

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

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

"Фантастика 2023-130". Компиляция. Книги 1-22

Демченко Антон Витальевич
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-130. Компиляция. Книги 1-22

Миф

Серый Александр
Фантастика:
научная фантастика
5.00
рейтинг книги
Миф

Большая Советская Энциклопедия (МЕ)

Большая Советская Энциклопедия
Справочная литература:
энциклопедии
5.00
рейтинг книги
Большая Советская Энциклопедия (МЕ)

Война

Андрижески Дж. С.
6. Мост и Меч
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Война

Хранители мечей

LitaWolf
3. Суженая из другого мира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хранители мечей

Химическая свадьба

Vilriel
Проза:
современная проза
5.00
рейтинг книги
Химическая свадьба

Иллюстрированная библейская энциклопедия

Архимандрит Никифор
Религия и эзотерика:
религия
6.00
рейтинг книги
Иллюстрированная библейская энциклопедия

1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Степанова Наталья Ивановна
Дом и Семья:
прочее домоводство
7.86
рейтинг книги
1001 заговор сибирской целительницы / Наталья Ивановна Степанова

Трол Возрожденный. Тетралогия

Басов Николай Владленович
42. В одном томе
Фантастика:
героическая фантастика
8.50
рейтинг книги
Трол Возрожденный. Тетралогия