Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Букатов, Заставной. Часть2

.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
390.02 Кб
Скачать

49.wprintf( L"IP отправителя: %S\n", inet_ntoa( ipheader.ipSrc ) );

50.wprintf( L"IP получателя: %S\n", inet_ntoa( ipheader.ipDst ) );

51.ICMP_Header icmp_ancw =

*(ICMP_Header*)&buf [sizeof(IPHEADER)];

52.wprintf( L"Type: %d\t Code: %d\t ID: %d\n",

icmp_ancw.type, icmp_ancw.code, icmp_ancw.id );

53.closesocket( sock );

54.// ……………………………………………

55.}

Комментарии.

Строки 1-13. Определение структуры, соответствующей заголовку IP-пакета.

Строки 14-23. Определение структуры, соответствующей ICMP-запросу формата

«Query/Echo reply». Первые два байта ICMP-пакета всегда содержат значения кодов ICMP-запросов, за которыми следует значение контрольной суммы,

которая проверяется при получении пакета для контроля целостности. Остальные поля структуры специфичны для данного вида запроса и ответа на него; для других видов запроса формат пакета может быть отличным от рассмотренного.

Подробное описание протокола ICMP и формат пакетов этого протокола описан в

RFC 792.

Строка 27. Создание Row-сокета; параметрами функции socket() являются значения SOCK_RAW и IPPROTO_ICMP; протокол ICMP, конечно,

поддерживается любым хостом в TCP/IP-сети.

Строки 28-30. Инициализация структура sockaddr_in; необходимо, как и при работе с обычными сокетами, указать тип сети (AF_INET) и IP-адрес получателя.

Номер порта, конечно, указывать не надо.

Строки 33, 34. Инициализация полей заголовка ICMP пакета значениями,

соответствующими запросу «Query/Echo reply».

21

Строка 35. Это поле должно содержать некоторое уникальное значение, которое будет возвращено в ответе на запрос, чтобы было возможно определить,

действительно является ли входящий пакет ответом на отосланный запрос. Строка 39. Вычисление контрольной суммы (определение функции checksum()

опущено).

Строки 40-43. Получение и установка значения поля TTL (Time To Live),

определяющее «время жизни» пакета. Это значение определяет количество маршрутизаторов, которое пройдет пакет до того, как будет выброшен следующим маршрутизатором как не доставленный. При помощи функции getsockopt() (строка 42) можно определить значение TTL, используемое по умолчанию, а при помощи функции setsockopt() – установить требуемое.

Отметим, что для сети Интернет значение TTL должно быть достаточно большим

(по умолчанию обычно используется значение 32, называемое «бесконечность»),

иначе пакет может быть удален до того как будет доставлен хосту-получателю.

Строка 44. Отправка ICMP-пакета.

Строка 46. Прием входящего ICMP-пакета, предположительно содержащего ответ на посланный запрос. Последние два параметра функции recvfrom()

игнорируются, поскольку адрес отправителя и так присутствует в заголовке IP-

пакета.

Строка 47. Первые 20 байт полученного блока данных, содержащих IP-заголовок,

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

Строка 51. Данные ICMP-пакета записываются в структуру ICMP_Header.

Приведенный фрагмент является очень упрощенной версией утилиты ping;

в частности, опущен анализ ICMP-ответа. Следует иметь в виду, что вызов функции recvfrom() прочтет только первый входящий ICMP-пакет. Этот пакет,

конечно, может быть любым другим ICMP-запросом, а не ответом на отосланный пакет; для проверки следует сравнивать значения поля id отосланного и

22

полученного пакетов. Кроме того, следует анализировать тип и код заголовка ответа; эти значения определяют, в том числе, был ли полученный ответ послан запрошенным хостом после получении запроса (следовательно, хост существует)

или каким-либо маршрутизатором по истечении значения TTL (в этом случае в

IP-заголовке будет указан адрес маршрутизатора).

Заключение

В данном учебно-методическом приведено описание средств и функций для написания сетевых приложений на основе многопотоковой архитектуры, и

основы программирования при помощи ROW-сокетов на языках С/С++ в среде ОС Windows, примеры, иллюстрирующие использование и применение этих функций, а так же методические указания для выполнения практических работ.

Пособие адресовано студентам второго курса факультета механики, математики и компьютерных наук Южного Федерального Университета, обучающимся по специальности «Прикладная математика» (010200) и изучающим курс

«Компьютерные сети». Представленный в пособии материал полностью соответствует разделу программы учебного курса дисциплины «Компьютерные сети» и содержит справочно-учебный материал, необходимый для выполнения самостоятельных практических работ, предусмотренных программой данного курса.

Кроме того, в пособие включен дополнительный материал, выходящий за рамки базового курса. Этот материал может быть использован в качестве справочной информации, требуемой при практической работе, а так же использован для самостоятельного углубленного изучения.

23

Приложение А.

Используемые функции с указателями на страницы

CloseHandle()…………………………………………………………………………....

7

CreateProcess()………………………………………………………………………….

5

CreateThread() ........................................................................................................

9

ExitThread()……………………………………………………………………………….

10

getsockopt() .............................................................................................................

22

TerminateThread()……………………………………………………………………….

10

WaitForMultipleObject()…………………………………………………………….......

16

WaitForSingleObject()…………………………………………………………………...

7

wcscmp() …………………………………………………………………………………

17

wcslen()……………………………………………………………………………………

17

wmemset()……………………………………………………………………..……........

17

wprintf()……………………………………………………………………………………

17

wscanf()……………………………………………………………………………………

17

24

Литература

1.Робачевский, А. Операционная система UNIX [Текст] : / А. Робачевский. -

СПб.: БХВ-Петербург, 2002.

2.Харт, Джонсон. Системное программирование в среде Windows [Текст], 3-е

издание : / Джонсон Харт. - М.- Эком. 2005.

3.Олифер, В., Н.А. Компьютерные сети. Принципы, технологии, протоколы

[Текст] : / В. Г. Олифер, Н.А. Олифер. - Санкт-Петербург: Питер, 2001г. - 765 c.

4.Стивенс, Ричард. Протоколы TCP/IP. Практическое руководство [Текст]: /

Ричард Стивенс. – М. – изд. BHV. 2003 г. – 672 c.

5.Джонс, Э. Программирование в сетях Microsoft Windows [Текст] : / Э.Джонс,

Д. Оланд. : - СПб.- изд. Питер. 2001 г. - 608 с.

25