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

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

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

 

 

 

 

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

 

 

Язык C# 61

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-x cha

 

 

 

Сокрытие данных. Объекты, то есть экземпляры класса могут содер-

df

 

e

 

 

 

 

 

 

n

 

 

 

 

жать данные, которые не могут быть изменены иначе как с помощью методов самого этого класса. Программист может скрыть данные, назначив им атрибут «private» (закрытый);

Абстрактные типы данных. Программист может определить класс, который можно представлять себе как обобщение структуры (struct), имеющейся в языке C. Класс описывает определенный программистом тип данных вместе с операциями, применимыми к объектам этого типа.

Прочие возможности

Язык C# предлагает также следующие возможности:

Автоматическую сборку мусора с помощью механизмов, встроенных в среду исполнения .NET;

Классы в C# могут снабжаться метаданными, хранящимися в виде атрибутов. Члены класса могут быть объявлены как public, protected, internal, protected internal или private в зависимости от того, какую свободу доступа к ним желательно предоставить;

В C# легко реализуется управление версиями. Программист может хранить различные версии откомпилированных файлов в разных пространствах имен. Это может существенно сократить время разработки крупных проектов;

В C# упрощен механизм обхода коллекций (структур, подобных массивам) за счет использования встроенных итераторов. Конструкция foreach позволяет перебрать все элементы коллекции;

В C# введено понятие делегата. Можно считать это неким аналогом указателя на метод. Делегат содержит информацию о том, как вызывать метод объекта. Делегаты широко применяются в C# для реализации обработчиков событий.

Безопасность

Модель безопасности в C# спроектирована с учетом среды исполнения .NET и предоставляет следующие возможности:

Полномочия (permissions). В пространстве имен System.Security.Permissions сосредоточена вся функциональность, относящаяся к полномочиям кода. Программа может определять полномочия и запрашивать их у вызывающей программы. Существует три типа полномочий: на исполнение кода, проверки идентичности и ролевые;

Политики безопасности. Администратор может создать политику бе-

зопасности, налагающую ограничения на те операции, которые может

62 Глава 1. Написание безопасных программ

 

 

 

 

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

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

выполнять программа. За соблюдением этих ограничений следит обще--x cha

 

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

языковая среда исполнения .NET (CLR – Common Language Runtime);

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

Безопасность по отношению к типам. C# гарантирует, что программа сможет получить доступ только к открытой для нее памяти.

Пример «Здравствуй, мир!» на языке C#

Программу «Здравствуй, мир!» (Hello, world!) часто приводят в пример, как простейшую из возможных программ на данном языке. Начинающие программисты на этом примере осваивают базовую структуру языка, учатся пользоваться компилятором и запускать программу на выполнение. Ниже приведен текст такой программы на языке C#.

Пример 1.18. Здравствуй, мир!

using System; class HelloWorld{

public static void Main() { Console.WriteLine("Hello, world!");

}

}

Эта программа очень напоминает составленную на языке Java. Класс HelloWorld содержит единственный метод Main, которому не передаются никакие аргументы. Этот метод открытый (public), то есть к нему можно обращаться извне класса HelloWorld. Он не возвращает значения, о чем говорит ключе- вое слово void. В C# метод WriteLine является членом класса Console. Он печа- тает строку «Hello, world!» на стандартный вывод.

Типы данных

Типы данных служат в языках программирования для определения переменных до их инициализации. Тип определяет, как переменная будет размещена в памяти и какие данные она может содержать. Говорят, что переменная является экземпляром некоторого типа данных. В языке C# есть две разновидности типов данных: значащие и ссылочные. В отличие от Java, в C# нет примитивных типов, например, int. В C# все данные являются объектами. В C# также разрешен прямой доступ к памяти с помощью указателей, но только внутри участков кода, помеченных ключевым словом unsafe (небезо-

 

 

 

 

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

 

 

 

 

 

 

Язык C# 63

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

мусора. В C# имеются следующие значащие типы:

Byte. Типом byte представляется целое число, занимающее 1 байт памяти;

Sbyte. Типом sbyte представляется целое число со знаком, занимающее 1 байт памяти;

Short. Òèï short служит для представления целых чисел со знаком, занимающих 2 байта памяти;

Ushort. Òèï ushort служит для представления беззнаковых целых чисел со знаком, занимающих 2 байта памяти;

Int. Òèï int служит для представления целых чисел со знаком, занимающих 4 байта памяти;

Uint. Òèï uint служит для представления беззнаковых целых чисел, занимающих 4 байта памяти;

Long. Òèï long служит для представления целых чисел со знаком, занимающих 8 байтов памяти;

Ulong. Òèï ulong служит для представления беззнаковых целых чисел, занимающих 8 байтов памяти;

Float. Типом float представляют числа с плавающей точкой, под которые отводится 4 байта;

Double. Òèï double служит для представления чисел с плавающей точ- кой двойной точности. Для них отводится 8 байтов;

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

Decimal. Это числовой тип, применяемый для финансовых расчетов. Под него отводится 8 байтов, значения этого типа должны сопровождаться суффиксом «M»;

String. Типом string представляется последовательность символов в кодировке Unicode. Размер строк не фиксирован;

Char. Òèï char служит для представления символов. В языке C# символ хранится в кодировке Unicode и занимает 16 битов;

Boolean. Типом boolean можно представить одно из двух значений: true или false. Он занимает 1 байт.

Âплатформенно-зависимых языках, к которым относится, в частности, C, точный объем памяти, отводимой под хранение данных разных типов, часто не определен. Напротив, в C# и в J#, как и в Java размер и формат всех типов данных специфицированы в самом языке. Программистам не надо думать

îсистемных особенностях.

ÂC# имеются также ссылочные типы. Переменные такого типа не содержат значения, а указывают на какой-то адрес в памяти. Массивы, объекты и интерфейсы – все это данные ссылочных типов. На рис 1.3 приведена класси-

фикация типов в языке C#.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

64

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

Глава 1. Написание безопасных программ

object

 

 

 

 

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

 

 

 

 

типы

 

 

Ссылоч*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ные типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Предопределенные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Знача*

 

 

 

 

 

string

 

 

 

bool

 

 

decimal

 

 

double

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перечис*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

лимые

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типы

 

 

 

 

 

 

 

 

 

 

 

 

 

щие типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Струк*

Простые

 

 

 

 

 

с плавающей

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

турные

 

 

 

 

 

точкой

 

 

 

 

 

 

 

 

 

 

 

 

 

типы

 

 

 

 

 

 

float

 

 

 

 

 

 

 

 

 

 

типы

 

Чис*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ловые

 

 

 

 

 

byte

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

char

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Целочислен*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ные типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

long

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sbyte

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

short

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

uint

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ulong

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ushort

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 1.3. Классификация типов данных в языке C#

Поток управления

В языке C# для управления потоком выполнения программы применяются циклы. В программах часто встречаются участки, которые надо повторить либо заранее известное число раз, либо до тех пор, пока не будет выполнено некоторое условие. Циклы как раз и предназначены для решения подобного рода задач. Имеется три основных вида циклов: for, while и do...while.

Пример 1.19. Цикл «for»

For( начальное_выражение; проверяемое_условие; операция ){ [блок предложений];

}

 

 

 

 

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

 

 

 

 

 

Язык C#

65

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

Из всех циклов for используется чаще всего. В начале выполнения цикла

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программа вычисляет начальное выражение и проверяет следующее за ним условие. Если условие истинно, выполняется тело цикла («блок предложений»). В конце цикла производится операция, указанная на третьей в заголовке, после чего снова проверяется условие. Цикл продолжается, пока условие не станет ложным.

Особенно хорошо цикл for подходит для выполнения итераций. Если нужно выполнить блок предложений пять раз, то можно написать такой простой цикл:

for( i = 0 ; i < 5 ; i++ ){ [блок предложений];

}

Пример 1.20. Цикл «while»

while( условие ){ [блок предложений];

}

При выполнении цикла while проверяется условие, стоящее в начале цикла. Если оно истинно, выполнение цикла продолжается, иначе прекращается. Цикл повторяется, пока условие не станет ложным.

Пример 1.21. Цикл «do...while»

do{

[блок предложений];

}while( условие );

Âцикле do...while проверяемое условие находится в конце и проверяется после выполнения блока предложений. Если оно истинно, то блок предложений выполняется еще раз, в противном случае происходит выход из цикла. Цикл do...while похож на цикл while с одним отличием: блок предложений будет выполнен хотя бы один раз. Циклы этого вида встречаются реже, чем for и while.

Следует отметить, что в большинстве случаев все три циклических конструкции функционально эквивалентны.

Пример 1.22. Эквивалентность циклов – выполнение пяти итераций.

Öèêë for

for( i = 0 ; i < 5 ; i++ ){ блок_предложений;

}

Öèêë while int i = 0; while( i < 5 ){

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

66 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

блок_предложений;

 

 

 

df-xchan

e

 

 

 

 

 

 

 

 

i++;

}

 

 

 

 

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

 

 

 

 

Öèêë do...while int i = 0;

do { блок_предложений; i++;

}while( i < 5 )

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

Методы

Можно сказать, что метод (в других языках его аналогом служит функция) – это миниатюрная программа. Иногда программисту нужно получить на входе определенные данные, произвести над ними некоторую операцию и вернуть результат в требуемом формате. Понятие метода и было придумано для таких повторяющихся операций. Метод – это автономная часть программы, которую можно вызвать для выполнения операции над данными. Метод принимает некоторое число аргументов и возвращает значение. Ниже приведен пример метода, который получает на входе целое число и возвращает его факториал.

Пример 1.23. Метод Factorial

int Factorial( int num ){

for( i = (num – 1) ; i > 0 ; i— ){

num *= i; /* сокращенная запись для num = num * i */

}

return num;

}

В первой строке Factorial – это имя метода. Ему предшествует ключевое слово int, говорящее о том, что метод возвращает целое значение. Часть ( int num ) означает, что метод принимает в качестве аргумента одно целое число, которое будет обозначаться num. Предложение return говорит о том, какое именно значение метод возвращает.

Классы

Объектно-ориентированные программы организованы в виде набора классов. Класс – это дискретная единица программы, обладающая определенны-

 

 

 

 

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

 

 

 

 

 

 

Язык C# 67

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Класс может содержать конструкторы, которые определяют, как создается

 

 

 

 

 

 

 

 

 

 

 

 

 

 

экземпляр класса или объект. В класс включаются методы, выполняющие

 

 

 

 

 

 

 

 

 

 

 

 

 

 

операции над экземплярами этого класса.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Предположим, например, что программист работает над симулятором по-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

летов для компании – производителя самолетов. Результаты этой работы по-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

могут компании принять важные проектные решения. В такой ситуации

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объектно-ориентированное программирование –

идеальный инструмент.

 

 

 

 

 

 

 

 

 

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

Класс может содержать несколько переменных, к примеру:

Weight (âåñ);

Speed (скорость);

Maneuverability (маневренность);

Position (положение).

С его помощью программист может смоделировать полет самолета при заданных условиях. Для модификации характеристик объекта можно написать несколько методов доступа:

SetWeight( int )

SetSpeed( int )

SetManeuverability( int )

SetPosition( int )

MovePosition( int )

Код такого класса plane мог бы выглядеть следующим образом:

Пример 1.24. Класс plane

1 public class plane{

2 int Weight;

3 int Speed;

4 int Maneuverability;

5 Location Position; /* тип Location должен быть где-то определен

6и представлять пространственные координаты (x,y,z) */

7 plane( int W, int S, int M, Location P ){

8Weight = W;

9Speed = S;

10Maneuverability = M;

11Position = P;

12}

13

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

68 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

14 SetWeight( plane current, int W ){

15current.Weight = W;

16}

17

18 /* Методы SetSpeed, SetManeuverability, SetPosition, MovePosition тоже должны быть определены */

19 }

 

 

 

 

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

 

 

 

 

Этот код служит для инициализации объекта класса plane. При вызове конструктора plane задаются все характеристики, которыми должен обладать самолет: вес, скорость, маневренность и положение. На примере метода SetWeight продемонстрировано, как можно включить в класс операцию над описываемым им объектом.

Симулятор может создать несколько экземпляров класса plane и выполнить «пробные полеты» для оценки влияния различных характеристик. Например, самолет plane1 может весить 5000 фунтов, летать со скоростью 500 миль/час и обладать маневренностью 10, тогда как для самолета plane2 можно задать такие параметры: вес 6000 фунтов, скорость 600 миль/час, маневренность 8. Объект plane1 можно создать с помощью таких предложений:

plane plane1;

Location p;

p = new Location( 3, 4, 5 );

plane1 = new plane(1.000, 400, 3, p );

Наследование позволяет программистам создавать иерархии классов. Классы организуются в древовидные структуры, в которых у каждого класса есть «родители» и, возможно, «потомки». Класс «наследует», то есть может пользоваться функциями любого из своих классов-родителей, называемых также его суперклассами. Например, если класс plane является подклассом класса vehicle, то объект класса plane имеет доступ ко всем методам, которые можно выполнять над объектом класса vehicle. В языке C# все классы прямо или косвенно наследуют корневому классу System.Object.

Óклассов есть много преимуществ, недостающих другим имеющимся

âязыке типам. Они предоставляют эффективное средство для организации программы в виде набора модулей, которым можно наследовать. Можно также создавать абстрактные классы, выступающие в роли интерфейсов. Интерфейс определяет, но не реализует некоторую функциональность, оставляя эту задачу своим подклассам. Данные класса можно объявлять закрытыми, гарантируя тем самым, что доступ к внутреннему состоянию класса возможен лишь с помощью специально предназначенных для этого

методов.

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df

 

Потоки в языке C#

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

Язык C#

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

69

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Для написания простых и эффективных инструментов сканирования потоки неоценимы, поскольку позволяют сканировать несколько портов параллельно, а не последовательно. Следующая несложная программа создает два потока, которые выводят на стандартный вывод 0 и 1.

1 using System;

2 using System.Threading;

3

4 public class AThread {

5

6public void ThreadAction( ) {

7for ( int i=0 ; i < 2 ; i++ ) {

8Console.WriteLine( "Thread loop executed: " + i );

9Thread.Sleep(1);

10}

11}

12}

13

14 public class Driver {

15

16 public static void Main( ) {

17

18AThread Thread1 = new AThread( );

19AThread Thread2 = new AThread( );

21ThreadStart TS1 = new ThreadStart( Thread1.ThreadAction )

22ThreadStart TS2 = new ThreadStart( Thread2.ThreadAction )

24Thread ThreadA = new Thread( TS1 );

25 Thread ThreadB = new Thread( TS2 );

26

27ThreadA.Start( );

28ThreadB.Start( );

29}

30}

Âстроке 2 импортируется пространство имен System.Threading. Содержащиеся в нем классы предоставляют доступ к функциональности, необходимой программе, в которой используются потоки. В классе AThread метод ThreadAction (строки 6–11) выводят 0 и 1. Цель программы – продемонстрировать порядок, в котором исполняются потоки. Предложение Thread.Sleep(1); в строке 9 заставляет текущий поток подождать одну миллисекунду, давая

тем самым возможность выполниться другому потоку.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

70 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

Перейдем теперь к классу Driver. В строках 18 и 19 создаются объекты клас--x cha

 

 

 

 

 

ñà AThread. В строках 21 и 22 указывается, какой метод следует исполнять при запуске потока. В строках 24 и 25 создаются потоки ThreadA è ThreadB. Òèï Thread, встречающийся в этих строках, определен в пространстве имен System.Threading. Наконец, в строках 27 и 28 запускается выполнение потоков.

Результат работы программы выглядит следующим образом:

0

0

1

1

Мы видим, что потоки исполняются параллельно. При последовательном выполнении числа были бы напечатаны в таком порядке: 0, 1, 0, 1. Поразмыслите, насколько полезны могут оказаться потоки при реализации сканеров.

Пример: разбор IP3адреса, заданного в командной строке

Разбирать заданный в командной строке IP-адрес приходится почти в каждой сетевой программе. Для приложений, претендующих на полезность, умение разбирать адреса целей или даже позволять пользователю задавать целые подсети или указывать несколько сетей – не роскошь, а насущная необходимость. Программа Nmap – бесплатная утилита для сканирования портов, которую можно загрузить с сайта www.insecure.org, – еще в начале 1990-х годов задала стандарт для разбора указанных в командной строке IP-адресов. Однако, если вы когда-либо пытались разобраться в исходных текстах Nmap, то понимаете, что это задача не для слабых духом.

Ниже приведен работающий пример программы эффективного разбора IP-адреса, написанной на языке C. Программу можно откомпилировать в Microsoft Visual Studio. Программа состоит из 5 файлов. Поскольку мы лишь хотели продемонстрировать подход к решению задачи, то она не делает ни- чего, кроме вывода адресов на stdout. В реальной программе нетрудно было бы поместить эти адреса в массив.

1/*

2* ipv4_parse.c

3*

4*/

5#include <stdio.h>

6#include <stdlib.h>

7#include <string.h>