настоящее время для создания сетевых приложений 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; { адрес компьютера, пославшего данные
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.