UNIX: разработка сетевых приложений
Шрифт:
В листинге 28.1 [1] приведены примеры работы нашей программы. В первом используется версия IPv4, а во втором IPv6. Обратите внимание, что мы установили для нашей программы
ping
флаг set-user-ID (установка идентификатора пользователя при выполнении), потому что для создания символьного сокета требуются права привилегированного пользователя. Листинг 28.1. Примеры вывода программы ping
freebsd % ping www.google.com
1
Все
PING www.google.com (216.239.57.99): 56 data bytes
64 bytes from 216.239.57.99: seq=0, ttl=53, rtt=5.611 ms
64 bytes from 216.239.57.99: seq=1, ttl=53, rtt=5.562 ms
64 bytes from 216.239.57 99: seq=2, ttl=53, rtt=5.589 ms
64 bytes from 216.239.57.99: seq=3, ttl=53, rtt=5.910 ms
freebsd % ping www.kame.net
PING orange.kame.net (2001:200:0:4819:203:47ff:fea5:3085): 56 data bytes
64 bytes from 2001:200:0:4819:203:47ff:fea5:3085: seq=0, hlim=52, rtt=422.066 ms
64 bytes from 2001:200:0:4819:203:47ff:fea5:3085: seq=1, hlim=52, rtt=417.398 ms
64 bytes from 2001:200:0:4819:203:47ff:fea5:3085: seq=2, hlim=52, rtt=416.528 ms
64 bytes from 2001:200:0:4819.203.47ff:fea5:3085: seq=3, hlim=52, rtt=429.192 ms
На рис. 28.2 приведен обзор функций, составляющих программу
ping
. < image l:href="#" /> Рис. 28.2. Обзор функций программы ping
Данная программа состоит из двух частей: одна половина читает все, что приходит на символьный сокет, и выводит эхо-ответы ICMP, а другая половина один раз в секунду посылает эхо-запросы ICMP. Вторая половина запускается один раз в секунду сигналом
SIGALRM
. В листинге 28.2 приведен заголовочный файл
ping.h
, подключаемый во всех файлах программы. Листинг 28.2. Заголовочный файл ping.h
//ping/ping.h
1 #include "unp.h"
2 #include <netinet/in_systm.h>
3 #include <netinet/in.h>
4 #include <netinet/ip_icmp.h>
5 #define BUFSIZE 1500
6 /* глобальные переменные */
7 char sendbuf[BUFSIZE];
8 int datalen; /* размер данных после заголовка ICMP */
9 char *host;
10 int nsent; /* увеличиваем на 1 для каждого sendto */
11 pid_t pid; /* наш PID */
12 int sockfd;
13 int verbose;
14 /* прототипы функций */
15 void init_v6(void);
16 void proc_v4(char*, ssize_t, struct msghdr*, struct timeval*);
17 void proc_v6(char*, ssize_t., struct msghdr*, struct timeval*);
18 void send_v4(void);
19 void send_v6(void):
20 void readloop(void);
21 void sig_alrm(int);
22 void tv_sub(struct timeval*, struct timeval*);
23 struct proto {
24 void (*fproc)(char*, ssize_t, struct msghdr*, struct timeval*);
25 void (*fsend)(void);
26 void (*finit)(void);
27 struct sockaddr *sasend; /* структура sockaddr{} для отправки,
полученная от getaddrinfo */
28 struct sockaddr *sarecv; /* sockaddr{} для получения */
29 socklen_t salen; /* длина sockaddr{} */
30 int icmpproto; /* значение IPPROTO_xxx для ICMP */
31 } *pr;
32 #ifdef IPV6
33 #include <netinet/ip6.h>
34 #include <netinet/icmp6.h>
35 #endif
Подключение заголовочных файлов IPv4 и ICMPv4
1-22
Подключаются основные заголовочные файлы IPv4 и ICMPv4, определяются некоторые глобальные переменные и прототипы функций. Определение структуры proto
23-31
Для обработки различий между IPv4 и IPv6 используется структура proto
. Данная структура содержит два указателя на функции, два указателя на структуры адреса сокета, размер структуры адреса сокета и значение протокола для ICMP. Глобальный указатель pr
будет указывать на одну из этих структур, которая будет инициализироваться для IPv4 или IPv6. Подключение заголовочных файлов IPv6 и ICMPv6
32-35
Подключаются два заголовочных файла, определяющие структуры и константы IPv6 и ICMPv6 (RFC 3542 [114]).
Поделиться:
Популярные книги
Ваантан
10. Другая сторона
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Все не случайно
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Академия
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Я еще не барон
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Варлорд
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Ищу жену для своего мужа
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Чиновникъ Особых поручений
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Хозяйка старой усадьбы
Любовные романы:
любовно-фантастические романы
8.07
рейтинг книги
Законы Рода. Том 2
2. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Сиротка
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Sos! Мой босс кровосос!
Любовные романы:
современные любовные романы
5.00
рейтинг книги
LIVE-RPG. Эволюция-1
1. Эволюция. Live-RPG
Фантастика:
социально-философская фантастика
героическая фантастика
киберпанк
7.06
рейтинг книги
Играть, чтобы жить. Книга 1. Срыв
1. Играть, чтобы жить
Фантастика:
фэнтези
киберпанк
рпг
попаданцы
9.31
рейтинг книги
Страж. Тетралогия
Страж
Фантастика:
фэнтези
9.11