Delphi

Xakep, номер #041, стр. 041-075-3


3. Вот здесь мы можем указывать, какой конкретно протокол нас интересует. Возможных значений тут немерено (например, IPPROTO_IP, IPPORT_ECHO, IPPORT_FTP и т.д.). Если хочешь увидеть все, то открывай файл winsock2.pas и запускай поиск по IPPORT_, и все что ты найдешь - это и будут возможные протоколы.

Синхронность/асинхронность

Теперь я хочу тебя познакомить с синхронностью и асинхронностью работы порта. Разница в этих двух режимах следующая.

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

Асинхронная работа: при этом режиме программа не спотыкается о каждую сетевую функцию. Допустим, что ты запросил все тот же коннект с сервером. Твоя прога посылает запрос на соединение и тут же продолжает выполнять следующие действия, не дожидаясь физического контакта с сервантом. Это очень удобно (но тяжело в кодинге), потому что можно использовать время, пока произойдет контакт, в своих целях. Единственное, что ты не можешь делать - вызывать сетевые функции, пока не произойдет реального физического контакта. Недостаток в том, что самому приходится следить за тем, когда закончится выполнение функции и можно будет дальше работать с сетью.

Полный коннект

Сокет готов, а значит, можно произвести соединение с сервером. Для этого в библиотеки winsock есть функция connect. У этой функции есть три параметра:

1. Переменная-сокет, которую мы получили после вызова функции socket.

2. Структура типа TSockAddr.

3. Размер структуры, указанной во втором параметре. Для того чтобы узнать размер, можно воспользоваться функцией SizeOf и указать в качестве параметра структуру.

Структура TSockAddr очень сложная, и описывать ее полностью нет смысла. Лучше мы познакомимся с нею на практике, а пока я покажу только основные поля, которые должны быть заполнены.

sin_family - семейство используемой адресации. Здесь нужно указывать то же, что указывали в первом параметре при создании сокета (для нас это РF_INET или AF_INET).

sin_addr - адрес сервера, куда мы хотим присоединиться.

sin_port - порт, на который мы хотим приконнектиться.

На деле это будет выглядеть так:

var

addr: TSockAddr;

begin

addr.sin_family := AF_INET;

addr.sin_addr := ServerName;

addr.sin_port := htons(21);

connect(FSocket, @addr, sizeof(addr));

end;

Shutdown

Ну и напоследок - функция для закрытия соединения - closesocket. В качестве параметра нужно указать переменную-сокет.

На сегодня я думаю закончить, а в следующий раз мы углубимся в сетевой кодинг и уже скоро напишем долгожданный мегабыстрый сканер портов. Исходники примера, как всегда, можно скачать с моего сайта www.cydsoft.com/vr-online после выхода этого номера в свет.

P.S. У меня к тебе просьба, на сто баксов :). Не пиши мне большие письма. После появления рубрики "Кодинг" меня каждый день валят вопросами. Я не в состоянии всем рассказывать то, о чем пишут книги. Я могу что-то подсказать, где-то помочь, но не больше. А просьбы типа помоги написать прогу вообще нереальны. Я отвечаю только на те вопросы, где ответ займет несколько строчек. Целые лекции по мылу я разводить не могу. Я бы с удовольствием помог всем, но это НЕВОЗМОЖНО. Вас слишком много, а я один :(((. Поэтому лучше разбей свой вопрос на несколько маленьких и спрашивай постепенно, а не все сразу.

Назад на стр. 041-075-2  Содержание