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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Перенос на языке NASL и наоборот 141

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchíèÿ,a

которая включает базу знаний, библиотеку функций и многое делает за

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вас. Программирование работы с сокетами, механизма регулярных выражений и поиска в строках – очень непростая задача, если решать ее на компилируемом языке. Даже при использовании библиотеки Perl Compatible Regular Expressions (PCRE – регулярные выражения, совместимые с Perl) для C++ для одного только сопоставления с образцом может понадобиться написать до 25 строк кода. Если говорить о сложности, то труднее всего переносить код для работы с сокетами. Все, конечно, зависит от целевого языка, но не исключено, что придется заново реализовывать многие базовые механизмы или искать способ включить в свой проект существующие библиотеки. Вот несколько правил, которые стоит помнить при переносе сценариев с NASL на другие языки:

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

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

3.Если в целевом языке нет встроенной поддержки регулярных выражений, а в исходном NASL-сценарии производится сопоставление строк с регулярными выражениями, то обратитесь к библиотеке PCRE для C/C++.

4.Убедитесь, что в переносимой программе все типы данных объявлены правильно.

5.Почти во всех языках (кроме Javascript, Perl и Java) вам придется реализовать какой-нибудь класс для работы со строками. Это упростит конструирование полезной нагрузки для атаки и анализ ответов.

6.Наконец, ваша программа должна сделать что-то полезное. Поскольку нельзя воспользоваться функцией display или передать отчет об уязвимости ядру Nessus, то необходимо определить, как программа сообщит о результате. В большинстве случаев достаточно вывести на

STDOUT сообщение УЯЗВИМА.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

142 Глава 2. Язык сценариев NASL

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

Резюме

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Язык NASL, подобно языку Custom Audit Scripting Language (CASL – язык сценариев для аудита безопасности), распространяемому компанией Network Associates, Inc. (NAI), спроектирован для расширения возможностей механизма анализа уязвимостей, имеющегося в бесплатной программе Nessus (www.nessus.org). Проект Nessus, который в 1998 году запустил Рено Дерезон, был и остается самым популярным бесплатным решением задачи оценки уязвимости системы и управления безопасностью. Хотя для реализации большей части средств идентификации хостов и сканирования портов в Nessus используется протоколNetwork Messaging Application Protocol (NMAP – прикладной протоколсетевых сообщений), но усилиями всемирного сообщества разработчиков эта программа обросла множеством сценариев, которые проверяют все аспекты безопасности: наличие установленных срочных исправлений (hot-fixes) для Windows, обнаружение служб UNIX и Web, идентификация сетевых устройств и возможность присоединения к беспроводным точкам доступа.

NASL – это интерпретируемый язык, то есть синтаксический анализ программы происходит во время выполнения. В NASL2 включены объектноориентированные возможности, в частности создание собственных классов. При переходе от NASL1 к NASL2 было реализовано немало улучшений, из которых самое заметное – кратное повышение производительности. NASL обладает очень простым и понятным API для работы с сокетами и сетевыми протоколами, а также базой знаний, которая позволяет хранить и повторно использовать результаты ранее выполненных сценариев. Наряду с большим количеством общедоступных сценариев, написанных специально для Nessus, база знаний – одно из самых примечательных свойств продукта. В ней можно хранить все, что угодно: шапки приложений, перечень открытых портов или найденные пароли.

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

Написание на NASL сценариев для выполнения сложных задач может занять несколько минут, часов или дней в зависимости от объема уже проделанной ранее кем-то работы. Самое сложное – определить последовательность атаки и решить, какая реакция жертвы свидетельствует о наличии уязвимости. NASL – это великолепный язык для создания сценариев, относящихся к безопасности, наверное, наиболее современный и к тому же совершенно бесплатный.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Обзор изложенного материала 143

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

Обзор изложенного материала

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Синтаксис языка NASL

Переменные не обязательно объявлять заранее. Преобразование типов, а также выделение и освобождение памяти производятся автоматически.

Существует два вида строк: «чистые» и «неочищенные». Неочищенные строки заключаются в двойные кавычки, escape-последовательности в них не преобразуются. Чистые строки обозначаются одиночными кавычками Встроенная функция string преобразует «очищает» строки путем интерпретации escape-последовательностей. Так, неочищенная строка «City\tState» будет преобразована в чистую строку «City State».

Не существует отдельного булевского типа. Но имеются константы TRUE и FALSE, определенные как 1 и 0 соответственно.

Написание сценариев на языке NASL

Сценарии на NASL преследуют одну из двух целей. Одни пишутся для личного употребления и выполняют конкретные задачи, которые больше никому могут быть не интересны. Другие проверяют наличие уязвимостей или ошибок конфигурирования и могут быть подарены всему сообществу пользователей Nessus для повышения степени безопасности сетей во всем мире.

В NASL есть десятки встроенных функций, обеспечивающих простой доступ к удаленным хостам по протоколам TCP и UDP. Они позволяют открывать и закрывать сокеты, посылать и принимать строки, определять, «выжил» ли хост после атаки и получать различную информацию о хосте, например, его имя, IP-адрес и следующий открытый порт.

Если Nessus собрана с библиотекой OpenSSL, то интерпретатор предоставляет функции, которые возвращают различные криптографиче- ские свертки и контрольные суммы. В частности, поддерживаются алгоритмы MD2, MD4, MD5, RIPEMD160, SHA и SHA1.

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

Сценарии на языке NASL

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

ÿäðó Nessus.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

144 Глава 2. Язык сценариев NASL

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

Пользоваться базой знаний нетрудно по двум причинам:

 

 

p

 

-x cha

 

 

 

 

 

 

df

 

e

 

 

 

 

df

 

e

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Доступ к ней прост и позволяет не тратить усилия на такие вещи как извлечение шапки, сканирование портов и повторную реализацию функциональности самой базы знаний;

Nessus автоматически порождает новые процессы, если база знаний возвращает более одного результата.

Перенос программ на язык NASL и обратно

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

NASL имеет больше общего с такими языками, как Perl и C, чем с жестко структурированными языками типа Java и Python.

Синтаксически C и NASL очень похожи, но NASL поддерживает слабо типизированные переменные и удобные высокоуровневые функции манипулирования строками, напоминающие то, что есть в Perl. Типичный NASL-сценарий содержит глобальные переменные и ряд функций для достижения поставленной цели.

Ссылки на сайты

Более подробную информацию вы найдете на следующих сайтах:

www.nessus.org – основной сайт проекта Nessus посвящен разработке новых сценариев для обнаружения уязвимостей;

www.tenablesecurity.com – сайт коммерческой компании Tenable Security, занимающейся разработкой продуктов для оценки уязвимости систем, в которых используются написанные для Nessus сценарии. Сама программа Nessus была создана директором этой компании по исследо-

ваниям и разработкам.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Часто задаваемые вопросы 145

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

Часто задаваемые вопросы

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Следующие часто задаваемые вопросы, на которые отвечают авторы книги, призваны помочь вам оценить, насколько хорошо вы поняли идеи, изложенные в данной главе, и возможные их применения на практике. Если вы хотите задать авторам вопрос, зайдите на страницу www.syngress.com/solutions и заполните форму Ask the Author. Заодно вы получите доступ к тысячам других ответов на сайте ITFAQnet.com.

Â: Можно ли продолжать писать сценарии на языке NASL1?

Î: Простой ответ – нет. Впрочем, некоторые NASL1-сценарии может разобрать интерпретатор NASL2. Обратное выполнимо гораздо реже. В NASL2 включено множество усовершенствований, поэтому «изучайте новое».

Â: Насколько эффективен NASL по сравнению с Perl или языком Microsoft ECMA?

Î: NASL – эффективный язык, но он не может равняться с Perl по развитости поддержки, количеству функций и быстродействию. Что касается интерпретатора Microsoft ECMA, то это базовая технология, на которой построены такие языки сценариев Microsoft как Javascript и VBScript. Они быстрее и, с некоторой точки зрения, более современные, чем Perl. Объектно-ориенти- рованная модель в них чище и проще для работы, но к числу недостатков следует отнести привязку к платформе Windows.

Â: Есть ли автоматические трансляторы для переноса на NASL или обратно? Î: Нет. Во время работы над этой книгой не существовало общедоступ-

ных инструментов такого рода.

Â: Можно ли повторно использовать объекты, написанные на NASL, как в других объектно-ориентированных языках?

Î: Поскольку NASL – язык сценариев, то механизм повторного использования – это копирование текста из старого проекта в новый. Но вы можете расширить язык, поскольку его исходные тексты доступны. NASL – это дополнительный механизм, работающий в среде Nessus, которая обеспечивает обмен данных между NASL-сценариями. Иногда эту технологию называют

рекурсивным анализом.

Â: Можно ли одновременно запускать несколько NASL-сценариев из командной строки?

Î: К сожалению, нет. Но нетрудно написать на другом языке, возможно на Perl, оболочку для командного интерпретатора NASL, которая будет запус-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

146 Глава 2. Язык сценариев NASL

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

кать несколько экземпляров интерпретатора, исполняющих сценарии, обра--x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

щенные к разным хостам. Можно назвать это грубой реализацией параллельного сканирования.

Â: Каковы типичные применения NASL, помимо оценки уязвимости?

Î: Снятие цифровых отпечатков приложений, генерирование случайных запросов по разным протоколам, идентификация программ. Вот три типич- ных способа применения, хотя в каждом случае лучше написать для этих целей специализированные инструменты на других языках, скажем, на C или C++.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

Глава 3

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

BSD сокеты

Описание данной главы:

Введение в программирование BSD сокетов

Клиенты и серверы для протокола TCP

Клиенты и серверы для протокола UDP

Флаги сокетов

Сканирование сети с помощью UDP сокетов

Сканирование сети с помощью ТСР сокетов

Многопоточность и параллелизм См. также главы 4 и 5

Резюме

Обзор изложенного материала

Часто задаваемые вопросы

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

148 Глава 3. BSD сокеты

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

 

e

 

 

 

 

 

 

n

Введение

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

BSD-сокеты (разработанные сотрудниками Калифорнийского университета в Беркли) – это программный интерфейс для межпроцессных коммуникаций (IPC). Именно этот интерфейс чаще всего используется для реализации сетевого взаимодействия между компьютерами. Протоколы Internet Protocol версии 4 (IPv4), User Datagram Protocol (UDP), Transmission Control Protocol (TCP) и другие, в совокупности именуемые TCP/IPv4, – это стандарт де-фак- то для обмена данными между процессами, работающими на разных компьютерах в сети. А для доступа к этим протоколам из программы применяются BSD-сокеты.

Сокеты позволяют реализовать различные модели межпроцессного взаимодействия: один с одним, один с многими и многие с многими. Их называют еще двухточечной моделью, широковещанием и групповым вещанием.

В этой главе мы детально рассмотрим вопросы программирования с помощью BSD-сокетов, в том числе программирование клиентов и серверов для протоколов TCP и UDP, тонкую настройку сокетов с помощью различных опций, а также коснемся темы многопоточности в сетевом программировании.

Примечание

Все примеры в этой главе были написаны и откомпилированы на платформе OpenBSD 3.2 / x86 с помощью компилятора GNU C вер сии 2.95.3 и оболочки tcsh версии 6.12.00.

Введение в программирование BSD сокетов

Интерфейс BSD-сокетов – это набор функций и типов данных. Впервые он появился в операционной системе BSD UNIX в начале 1980-х годов, а теперь включен почти во все варианты системы UNIX и поддерживается также на платформе Microsoft Windows (Winsock).

API сокетов широко применяется в программах на языке C для реализации взаимодействия по протоколам TCP и UDP. Существует два основных вида приложений, в которых используются сокеты: клиент è сервер. Клиентские приложения создают оконечную точку коммуникации и инициируют сеанс

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Клиенты и серверы для протокола TCP 149

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchсвязиa

с удаленным серверным приложением. Напротив, серверное приложе-

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние пассивно ожидает запросов от клиента.

И для клиента, и для сервера важна идея оконечной точки коммуникации, которая и называется «сокетом». Сокет однозначно идентифицирует соединение и создается с помощью функции socket(). Роль сокета затем уточняется

ñпомощью функций connect() èëè accept(). Так или иначе, клиентская оконечная точка соединяется с серверной, после чего может начаться обмен данными. В случае протоколов UDP и TCP сокет представляет собой комбинацию адреса и порта локального компьютера с адресом и портом удаленного компьютера.

Типичная последовательность создания клиентского сокета начинается

ñвызова функции socket(), которая запрашивает ресурсы у операционной системы и получает от нее, в частности, дескриптор сокета и номер локального порта. Затем надлежит определить адрес и номер порта удаленного хоста,

ñкоторым требуется установить соединение. Само соединение устанавливается путем вызова функции connect(). Если операция выполнилась успешно, то можно передавать данные. Для чтения из локального порта служат функции read() è recv(), а для записи в удаленный порт – функции write() è send().

Клиенты и серверы для протокола TCP

TCP – наиболее часто используемый протокол из набора TCP/IP. В этом разделе мы рассмотрим два примера, иллюстрирующих процесс написания TCPклиента и TCP-сервера.

Âпримере 3.1 показано, как клиент может инициализировать, установить

èразорвать TCP-соединение.

Пример 3.1. TCP*клиент (client1.c)

1 /*

2 * client1.c

3*

4* Установление и разрыв TCP-соединения

5* с помощью функций socket(),

6 * connect() and close().

7 *

8 *

9*

10 */

11

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

150 Глава 3. BSD сокеты

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

d

 

 

 

 

e

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

f-xchan

12 #include <stdio.h>

 

 

 

 

 

 

 

 

 

13 #include <sys/types.h>

 

 

 

 

 

 

 

 

 

14 #include <sys/socket.h>

 

 

 

 

 

 

 

 

 

15 #include <netinet/in.h>

 

 

 

 

 

 

 

 

 

16

 

 

 

 

 

 

 

 

 

 

17 int

 

 

 

 

 

 

 

 

 

 

18 main

(int argc, char *argv[])

19{

20struct sockaddr_in sin;

21int sock = 0;

22int ret = 0;

23

24if(argc != 3)

25{

26printf("usage: %s: ip_address port\n", argv[0]);

27return(1);

28}

29

30sock = socket(AF_INET, SOCK_STREAM, 0);

31if(sock < 0)

32{

33printf("TCP-клиент: ошибка socket().\n");

34return(1);

35}

36

37 memset(&sin, 0x0, sizeof(struct sockaddr_in *));

38

39sin.sin_family = AF_INET;

40sin.sin_port = htons(atoi(argv[2]));

41sin.sin_addr.s_addr = inet_addr(argv[1]);

43ret = connect(sock, struct sockaddr *)&sin,

44sizeof(struct sockaddr);

45if(ret < 0)

46{

47printf("TCP-клиент: ошибка connect().\n");

48close (sock);

49return(1);

50}

51

52printf("TCP-клиент установил соединение.\n");

53close(sock);

54

55 printf("TCP-клиент закрыл соединение.\n");

56

57return(0);

58}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha