- •«Дальневосточный федеральный университет»
- •Школа естественных наук материалы практических занятий
- •Определение установок сетевого адаптера
- •2.3. Определение сетевого адреса и маски сети
- •Разграничение доступа к сетевым ресурсам
- •2.5. Проверка сетевого соединения в tcp/ip - сетях.
- •1. Теоретическое введение
- •Имена почтовых ящиков.
- •1.2. Сервер почтовых ящиков
- •1.3 Пример создания сервера почтовых ящиков
- •1.4. Клиент почтовых ящиков
- •1.5 Создания клиента почтовых ящиков
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •1. Теоретическое введение
- •1.2. Процедуры и функции Win32 для работы с файлами
- •1.2.1. Создание или открытие файла
- •1.2.2. Запись в файл
- •1.2.3. Чтение из файла
- •1.2.4. Закрытие файла
- •1.3. Пример программы, использующей функции Win32 для доступа к файлам и каталогам
- •1.4. Функции Delphi для работы с файлами
- •1.4.1. Открытие и закрытие файла
- •1.4.2. Типы файлов
- •1.4.3. Обработка ошибок при работе с файлами в Delphi
- •1.5. Пример программы, использующей функции Delphi для доступа к файлам и каталогам
- •2. Задание по лабораторной работе
- •1. Теоретическое введение
- •Пример создания сервера именованных каналов, работающего в блокирующем режиме
- •Пример создания клиента именованных каналов
- •Задание по практическому занятию
- •Создание серверного приложения,
- •Создание клиентского приложения,
- •2.3. Расширение возможностей именованных каналов
- •1. Теоретическое введение
- •1.1. Особенности организации работы именованных
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 6. Поиск доступных сетевых ресурсов
- •1. Теоретическое введение
- •Алгоритм поиска сетевых ресурсов
- •1.2. Структуры и функции для работы с сетевыми ресурсами
- •2.Задание по практическому занятию
- •1. Теоретическое введение
- •1.1. Назначение протокола NetBios
- •1.2. Назначение протокола NetBeui
- •2. Задание по практическому занятию
- •Занятие 8. СокетыWindows. Создание клиент-серверного приложения работающего по протоколуUdp
- •1. Теоретическое введние
- •1.1. Сокеты windows
- •1.2. Функции winsock для протокола udp
- •1.2.1. Инициализация интерфейса сокетов
- •1.2.2. Создание сокета
- •1.2.3. Определение номера порта и ip-адреса, по которому сервер будет принимать данные
- •1.2.4. Передача данных
- •2. Задание по практическому занятию
- •2.2. Создание клиентского приложения
- •2.3. Реализация возможностей функций Winsock по передаче данных между различными компьютерами в сети
- •Занятие 9. Исследование возможностей использования сокетов windows для организации обмена информацией между клиентом и сервером по протоколу тср
- •1. Теоретическое введение
- •1.1. Функции Winsock для протокола tcp
- •1.1.1. Установление соединения
- •1.1.3. Блокирование выполнения программы до тех пор, пока не поступит запрос на установление соединения
- •1.1.4. Передача данных
- •1.1.5. Получение данных по сети
- •1.2. Алгоритм работы Winsock- приложения по протоколу tcp
- •2. Задание по лабораторной работе
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •2.3. Исследование возможностей функций Winsock по передаче данных между различными компьютерами в сети
- •Занятие 10. Исследование методов сканирования сети
- •1. Теоретическое введение
- •2.1. Создание многопоточного приложения для сканирования сети
- •2.2. Исследование различных методов сканирования сети
- •Занятие 11. Применение сокетного соединения для обеспечения сетевого взаимодействия клиента и сервера
- •1. Теоретическое введение
- •1.1. Компоненты Delphi, инкапсулирующие сокеты
- •1.2. Компоненты Delphi tcpserver и tcpcl1ent
- •1.2.1. Установление соединения
- •1.2.2. Синхронизация сокетов
- •1.2.3. Класс TserverWinsocket
- •1.2.4. Компонент TserverSocket
- •1.2.5. Класс tClientWinsocket
- •1.2.6. Компонент tClientSocket
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •1. Задание по лабораторной работе
- •1.1. Создание серверного приложения
- •1.2. Создание клиентского приложения
- •1.3. Исследование возможностей сервер-приложения
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •Занятие 14. Исследование возможностей поддержки протокола тср
- •1. Теоретическое введение
- •1.1. Методы indy-компонента- IdTcpClient
- •1.2. Методы indy-компонента - IdTcpServer
- •2. Задание по лабораторной работе
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 15. Программирование клиентских приложений для работы с серверами internet
- •1. Теоретическое введение
- •Библиотека WinInet
- •1.2. Функции библиотеки wininet
- •1.2.1. Функция создания сеанса связи InternetOpen
- •1.2.2. Функция установления url-соединения InternetOpenUrl
- •1.2.3. Функция чтения файла, находящегося на web-cepвepe InternetReadFile
- •1.2.4. Функция закрытия дескриптора – InternetCloscHandle
- •1.2.5. Функция установления соединения InternetConnect
- •1.2.6. Функция «Найти первое вхождение файла с указанным групповым именем» FtpFindFirstFile
- •1.2.7. Функция «Найти следующие вхождения файла с указанным групповым именем» InternetFindNextFile
- •1.2.8. Функция «Получить имя текущего Каталога на ftp-сервере» -FtpGetCurrentDirectory
- •1.2.9. Функция чтения файла с http-сервера FtpGetFile
- •2. Задание по практическому занятию
- •2.1. Создание клиентского приложения.
- •Занятие 16. Приём и передача файлов по сети с использованием протокола tftp
- •1. Теоретическое введение
- •1.1. Протокол tftp
- •1.2. Компонент- idTrivialFtp
- •Компонент IdTrivialFtpServer
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 17. Создание http- клиента
- •1. Теоретическое введение
- •1.1. Свойства и методы компонента IdHttp
- •1.1.1. Метод get
- •1.1.2. Метод trace
- •1.1.3. Метод put
- •2. Задание по практическому занятию
- •2.1. Создание http-клиента
- •4. Как изменить приложение таким образом, чтобы файл с сервера записывался не в поле Memo, а в какой-либо файл на компьютере клиента? Каким должен быть тип переменной s в данном случае?
- •Тексты заданий самостоятельной работы задание № 1 создание web-браузера
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •Задание № 2 исследование telnet-клиента
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •2.1. Создание приложения Telnet-клиента
- •2.2. Исследование Telnet-клиента
- •Задание №3 разработка cgi-программ
- •1. Теоретическое введение
- •1.1. Принцип работы cgi-программ
- •1.2. Описание тега form
- •1.2.1. Тег input
- •1.2.2. Тег select
- •1.2.3. Тег textarea
- •13. Подтверждение и посылка запроса cgi-программе
- •2. Задание по практическому занятию
- •2.1. Создание простейшего серверного приложения
- •2.2. Передача cgi-приложению параметров, введенных пользователем, и получение дополнительной информации из переменных окружения
- •Задание № 4 разработка web-приложения
- •1. Теоретическое введение
- •1.1. Общее описание компонента twebmodule
- •1.2. Параметр request
- •1.3. Параметр response
- •1.4. События twebmodule
- •2. Задание по практическому занятию
- •2.1. Создание web-приложения с помощью компонента Delphi -webmodule
2.2. Создание клиентского приложения
1) Создать новый проект и разместить на нем элементы управления, как показано на рис. 2.
Рис. 2
2) В раздел VAR проекта ввести следующие переменные:
var
Form1: TForm1;
PipeClient: THANDLE; {Описатель клиента именованных каналов}
Evnt: THANDLE;{Объект «событие» для организации работы
функции ConnectNamedPipe в неблокирующем режиме}
Evntclient: THANDLE;{Объект «событие» для организации работы
функции WriteFile в неблокирующем режиме}
BytesRead: DWORD; {Переменная для хранения количества
переданных серверу байт}
buffers: Array [0..80] of char; {Буфер, в который записываются
прочитанные сообщения}
Pipe_name: Array [0..80] of char {Буфер для хранения имени канала};
OvLap, OvLapClient: TOVERLAPPED; {Структуры OVERLAPPED для
работы клиента в неблокирующем режиме}
ret: Boolean; {В эту переменную записывается результат операции}
BytesWritten: DWORD;{Количество передаваемых клиентом байт}
hThreadR, hThreadW, hThreadC: THANDLE; {Описатели
дополнительных программных потоков для чтения, записи
и установления соединения в неблокирующем режиме}
pFunc1, pFunc2, pFunc3: pointer; {Указатели функций, на основе
которых создаются вспомогательные потоки}
ThreadID1, ThreadID2, ThreadID3: CARDINAL; {Идентификаторы
вспомогательных потоков}
implementation.
3) Напишите дополнительную процедуру для создания нового потока. Функция циклически опрашивает готовность клиента установить соединение.
procedure ThreadConnect;
Var flg: Boolean;
begin
ZeroMemory(@Ovlap, sizeof(TOVERLAPPED));
OvLap.hEvent := Evnt;
While not flg do
Begin
ret := ConnectNamedPipe(PipeClient, @OvLap);
if (ret<>False) or ((ret<>False) and (GetLastError<>ERROR_PIPE_CONNECTED))
then flg := True
else Sleep(1000);
end;
end;.
4) Напишите дополнительную процедуру для создания нового потока. Процедура позволяет читать данные в неблокирующем режиме.
procedure ThreadRead;
begin
ZeroMemory(@Ovlap, sizeof(TOVERLAPPED));
OvLap.hEvent := Evntclient;
ZeroMemory(@buffers, sizeof(buffers));
ret := ReadFile(PipeClient, buffers, sizeof(buffers), BytesRead, @OvLap);
WaitForSingleObject(Evntclient, Infinite);
Form1.Edit2.Text := Buffers;
end;.
5) Напишите дополнительную процедуру для создания нового потока. Эта процедура позволяет передавать данные на сервер в неблокирующем режиме.
procedure ThreadWrite;
Var retw: Boolean;
Bf: Array [0..80] of Char;
begin
ZeroMemory(@OvlapClient, sizeof(TOVERLAPPED));
OvLapClient.hEvent := Evntclient;
StrCopy(@Bf, PChar(Form1.Edit1.Text));
retw := WriteFile(PipeClient, Bf, sizeof(bf), BytesWritten, @OvLapClient);
WaitForSingleObject(evntclient, INFINITE);
end;.
6) Для создаваемой формы в событие OnCreate запишите следующий программный код:
procedure TForm1.FormCreate(Sender: TObject);
begin
//Создание события для установления соединения
Evnt := CreateEvent(Nil, FALSE, FALSE, Nil);
if Evnt=0 then
begin
ShowMessageFmt('Ошибка %d при создании объекта событие',
[GetLastError]);
exit; end;
//Создание события на клиенте
Evntclient := CreateEvent(Nil, FALSE, FALSE, Nil);
if Evntclient=0 then
begin
ShowMessageFmt('Ошибка %d при создании объекта событие',
[GetLastError]);
exit; end;
end;.
7) Для события OnClick кнопки «Создание клиента» запишите следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
begin
strcat(@pipe_Name,'\\.\Pipe\Jim');
if WaitNamedPipe(@PIPE_NAME, NMPWAIT_WAIT_FOREVER)=False then
begin
ShowMessageFmt('Функция WaitNamedPipe завершена с ошибкой %d', [GetLastError]);
exit; end;
// Открытие экземпляра именованного канала
PipeClient := CreateFile(@PIPE_NAME, GENERIC_READ or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);
if PipeClient=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Функция CreateFile завершена с ошибкой %d',
[GetLastError]);
end
else ShowMessage('Клиент работает');
end;.
8) Для события OnClick кнопки «Установление соединения» запишите следующий программный код:
procedure TForm1.Button3Click(Sender: TObject);
begin
pFunc3 := @ThreadConnect;
hThreadC := CreateThread(nil,0,pFunc3,nil,0,ThreadID1);
end;.
9) Для события OnClick кнопки «Передача сообщения» запишите следующий программный код:
procedure TForm1.Button5Click(Sender: TObject);
begin
pFunc2 := @ThreadWrite;
hThreadW := CreateThread(nil, 0, pFunc2, nil, 0, ThreadID2);
end;.
10) Для события OnClick кнопки «Чтение сообщения» запишите следующий программный код:
procedure TForm1.Button4Click(Sender: TObject);
begin
pFunc1 := @ThreadRead;
hThreadR := CreateThread(nil, 0, pFunc1, nil, 0, ThreadID1);
end;.
11) Для события OnClick кнопки «Закрыть канал» запишите следующий программный код:
procedure TForm1.Button6Click(Sender: TObject);
begin
if DisconnectNamedPipe(Pipeclient)=False then
begin
ShowMessageFmt('Ошибка %d при закрытии канала', [GetLastError]);
exit; end;
CloseHandle(PipeClient);
CloseHandle(evnt);
end;.
12) Для события OnClick кнопки «Проверка неблокирующего режима» запишите следующий программный код:
procedure TForm1.Button8Click(Sender: TObject);
begin
ShowMessage('Работа в неблокирующем режиме');
end;.
13) Для события OnClick кнопки «Выход» запишите следующий программный код:
begin
Form1.Close;
end;.
14) Откомпилируйте проект.
15) Проверьте совместную работу клиента и сервера в неблокирующем режиме по передаче пакетов различной длины.
ЛИТЕРАТУРА
Джонс Э., Оланд Дж. Программирование в сетях MicrosoftWindows. Мастер-класс /Пер. с англ. М., Издательско-торговый дом «Русская редакция», 2002. 608 с.
КОНТРОЛЬНЫЕ ВОПРОСЫ
Объясните особенности работы функций файлового ввода-вывода в асинхронном (неблокирующем режиме).
Какие объекты синхронизации вы знаете?
Опишите алгоритм работы многопоточного приложения.
Для каких целей используется функция WaitForSingleObject?
Перечислите преимущества асинхронного (неблокирующего) режима работы.
Какие функции именованных каналов надо настроить на неблокирующий режим?
