Delphi

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


2. Структура типа TWSADATA, в которой будет возвращена информация о найденном winsock.

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

Первый пример

Давай сразу напишем пример, который будет инициализировать Winsock и выводить на экран информацию о нем. Создай в Delphi новый проект. Теперь к нему надо подключить заголовочные файлы winsock 2-й версии. Для этого надо перейти в раздел uses и добавить туда модуль winsock2.

Если ты попробуешь сейчас скомпилировать этот пустой проект, то Delphi проругается на добавленный модуль. Это потому, что он не может найти сами файлы. Если ты скачал заголовочные файлы Winsock2 с моего сайта, то можно поступить двумя способами:

1. Сохранить новый проект в какую-нибудь диру и туда же забросить файлы WinSock2.pas, ws2tcpip.inc, wsipx.inc, wsnwlink.inc и wsnetbs.inс. Неудобство этого способа - в каждый проект, использующий Winsock2, надо забрасывать заголовочные файлы.

2. Можно забросить эти файлы в диру Delphi\Lib, и тогда уж точно любой проект найдет их.

Шкодим

Теперь создай форму, хоть чем-то похожую на рисунок 1. После этого создай обработчик события OnClick для кнопки и напиши там следующий текст:

procedure TForm1.Button1Click(Sender: TObject);

var

info:TWSADATA;

begin

WSAStartup(MAKEWORD(2,0), info);

VersionEdit.Text:=IntToStr(info.wVersion);

DescriptionEdit.Text:=info.szDescription;

SystemStatusEdit.Text:=info.szSystemStatus;

WSACleanup;

end;

В самом начале я стартую winsock с помощью WSAStartup. В нем я запрашиваю 2-ю версию, а информация о текущем состоянии мне будет возвращена в структуру info. После этого я вывожу полученную инфу для всеобщего просмотра.

При выводе информации о версии у меня есть небольшая проблема, потому что свойство wVersion структуры info имеет числовой тип, а для вывода мне надо преобразовать его в строку. Для этого я выполняю преобразование с помощью IntToStr.

Подготовка разъема

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

1. Тип используемой адресации. Нас интересует Инет, поэтому мы будем указывать PF_INET или AF_INET. Как видишь, оба значения очень похожи и показывают одну и ту же адресацию, только в первом случае работа будет синхронной, а во втором асинхронной.

2. Базовый протокол. Здесь мы должны указать, на основе какого протокола будет происходить работа. Если ты регулярно читаешь Х и рубрику "Кодинг", то должен знать, что существует два базовых протокола - TCP (с надежным соединением) и UDP (не производящий соединений, а просто выплевывающий данные в порт). Для TCP в этом параметре надо указать SOCK_STREAM, а если нужен UDP, то указывай SOCK_DGRAM.

Назад на стр. 041-075-1  Содержание  Вперед на стр. 041-075-3