Примеры выполнения лабораторных заданий по созданию сетевых приложений в средах программирования Delphi/C++Builder

Страницы работы

Фрагмент текста работы

настоящее время для создания сетевых приложений Windows, ориентированных на спецификацию Windows Sockets, стало доступно инструментальное средство под названием dWinsock (http://www.aait.com). Авторы разработки – Ulf Soderberg (ulfs@sysinno.se), Marc Palmer (marc@anyware.co.uk) и Keith Hawes (khawes@ccmail.com). dWinsock является дополнением к системе визуального программирования BorlandDelphi и включает в свой состав набор компонент и объектно-ориентированную библиотеку. Библиотека классов dWinsock позволяет разрабатывать приложения системы клиент-сервер, обеспечивающие коммутацию канала связи (TCP) или пакетов (UDP) для обмена данными. Для работы с dWinsock необходимо наличие динамически загружаемой библиотеки winsock.dll (wsock32.dll).

Ниже описан состав библитотеки (см. dwinsock.hlp):

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

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

Для работы на базе протокола UDP используется класс TDatagramSocket. При работе с TCP можно использовать три класса: TStreamSocket, TBufferSocket, TLineSocket.

При использовании TStreamSocket необходимо контролировать процесс передачи (приема) данных в случае пересылки большого объема информации. Это осуществляется методом слежения за тем, какая часть данных уже передана или принята. Для разрешения этой проблемы в класс TBufferedSocket инкапсулированы специальные буферы чтения и записи, размещаемые в памяти отдельно друг от друга, а также средства управления ими. Это позволяет отправлять и принимать данные независимо от готовности программы к соответствующей операции.

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

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

Класс ESockError обрабатывает исключительные ситуации (некорректности функционирования), которые могут возникать в процессе работы приложения Windows.

Приведенный перечень исчерпывающ, так как в нем отражены лишь основные компоненты библиотеки.

В качестве иллюстрации приложения Windows нижепредлагаются примеры составления процедур на языке Object Pascal, объединяющей функции клиента и сервера; конечная программа служит для передачи сообщения по указанному адресу.

При старте приложения выполняется процедура:

procedure TForm1.FormCreate(Sender: TObject);

begin

try { включить отслеживание исключительных ситуаций - ИС }

ClientSocket1.SetSocketClass(TDatagramSocket);

ServerSocket1.Listen(TDatagramSocket);

except

on E: ESockError do

ShowMessage(E.Message); { обработка ИС }

end;

end;

Здесь ServerSocket1 суть объект класса ТServerSocket; ServerSocket1.Listen(...) - метод объекта, переводящий программу в режим ожидания запросов от клиентов, в данном случае для соединения на основе UDP. ClientSocket1 суть объект класса TClientSocket; ClientSocket1.SetSocketClass(...) - метод, настраивающий программу клиента на передачу с использованием UDP.

 Для передачи данных используется процедура:

procedure TForm1.Button1Click(Sender: TObject);

var

buf:array[0..STRSIZE] of Char; { буфер для передаваемых данных }

begin

ClientSocket1.Port:=DestPortEdit.Text;

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

StrPLCopy(buf,TextToSendEdit.Text,STRSIZE);

try

(ClientSocket1.Conn as TDatagraSocket). SendTo(DestAddressEdit.Text,

buf,StrLen(buf)); { процедура, выполняющая передачу, где

DestAddressEdit.Text - адрес, куда будут переданы данные }

except

on E:ESockError do

ShowMessage(E.Message);

end;

end;

 Прием данных выполняется следующим образом:

procedure TForm1.ServerSocket1Read(Sender: TObject;

Socket: TSocketBase);

var

ReceivedString:string; { строка для вывода полученных данных }

getdata,newdata :array[0..STRSIZE] of Char; { буферы для приема данных }

sz:Integer; { размер принятого блока данных}

fromsa : sockaddr_in;

{ структура данных, содержащая информацию о компьютере, пославшем данные }

fromlen : Integer; { размер структуры данных fromsa }

fromname : string; { адрес компьютера, пославшего данные

Похожие материалы

Информация о работе