Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

В листинге 28.1 [1] приведены примеры работы нашей программы. В первом используется версия IPv4, а во втором IPv6. Обратите внимание, что мы установили для нашей программы

ping
флаг set-user-ID (установка идентификатора пользователя при выполнении), потому что для создания символьного сокета требуются права привилегированного пользователя.

Листинг 28.1. Примеры вывода программы ping

freebsd % ping www.google.com

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

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 */

  • Читать дальше
  • 1
  • ...
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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