- •«Дальневосточный федеральный университет»
- •Школа естественных наук материалы практических занятий
- •Определение установок сетевого адаптера
- •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
1. Теоретическое введение
В теоретическом введении рассматриваются особенности организации именованных каналов в неблокирующем режиме.
1.1. Особенности организации работы именованных
каналов в неблокирующем режиме
Для организации работы именованных каналов в неблокирующем режиме применяются структуры и функции, рассмотренные в предыдущем занятии. Однако есть особенности, для реализации которых требуется:
в функции CreateNamedPipe указать флаг работы в неблокирующем режиме FILE_FLAG_OVERLAPPED;
в функциях ConnectNamedPipe, ReadFile и WriteFile необходимо передавать, в качестве одного из параметров, адрес инициализированной структуры OVERLAPPED (перекрывающий). Этот параметр указывает, что операции файлового ввода-вывода будут перекрываться с выполнением других операций;
структура OVERLAPPED имеет следующий вид:
OVERLAPPED = record
Internal: DWORD;
InternalHigh: DWORD;
Offset: DWORD;
OffsetHigh: DWORD;
hEvent: THandle;
end;.
В этой задаче структуру OVERLAPPED следует заполнить нулями и инициализировать только одно поле hEvent, в которое записывается описатель объекта синхронизации. Объект синхронизации указывает момент окончания операции.
4) Для асинхронной работы функций ConnectNamedPipe, ReadFile и WriteFile создаются три дополнительных потока. Эти потоки запускают на выполнение соответствующую функцию файлового ввода-вывода (ConnectNamedPipe, ReadFile и WriteFile) и с помощью функции WaitForSingleObject ожидают завершения данных функций.
2. Задание по практическому занятию
Разработать клиент-серверное приложение, выполняющее прием и передачу сообщений от клиента к серверу и от сервера к клиенту в неблокирующем режиме.
2.1. Создание серверного приложения
1) Создать новый проект и разместить на нем элементы управления, как показано на рис. 1.
Рис. 1
2) В раздел VAR проекта ввести следующие переменные:
var
Form1: TForm1;
PipeHandle: THANDLE; {Описатель сервера именованных каналов}
evntserver: THANDLE;{Объект «событие» для организации работы
функции ReadFile и WriteFile в неблокирующем режиме}
BytesRead: DWORD; {Переменная для хранения количества
переданных серверу байт}
buffers: Array [0..80] of char; {Буфер, в который записываются
прочитанные сервером сообщения}
Pipe_name: Array [0..80] of char {Буфер для хранения имени канала};
OvLap: TOVERLAPPED; {Структура OVERLAPPED для
работы сервера в неблокирующем режиме}
ret: Boolean; {В эту переменную записывается результат операции}
BytesWritten: DWORD;{Количество передаваемых байт}
hThreadR, hThreadW: THANDLE; {Описатели дополнительных
программных потоков для чтения и записи в неблокирующем режиме}
pFunc1, pFunc2: pointer; {Указатели функций, на основе
которых создаются вспомогательные потоки}
ThreadID1, ThreadID2: CARDINAL; {Идентификаторы
вспомогательных потоков}
implementation.
3) Напишите дополнительную процедуру для создания нового потока. Процедура позволяет читать данные в неблокирующем режиме.
procedure ThreadRead;
begin
ZeroMemory(@Ovlap, sizeof(TOVERLAPPED));
OvLap.hEvent := Evntserver;
ZeroMemory(@buffers, sizeof(buffers));
ret := ReadFile(PipeHandle, buffers, sizeof(buffers), BytesRead, @OvLap);
WaitForSingleObject(Evntserver,Infinite); Form1.Edit2.Text := Buffers;
end;.
4) Напишите дополнительную процедуру для создания нового потока. Процедура позволяет передавать данные клиенту в неблокирующем режиме.
procedure ThreadWrite;
Var retw: Boolean;
Bf: Array [0..80] of Char;
begin
ZeroMemory(@Ovlap, sizeof(TOVERLAPPED));
OvLap.hEvent := Evntserver;
StrCopy(@Bf, PChar(Form1.Edit1.Text));
retw := WriteFile(PipeHandle, Bf, sizeof(bf), BytesWritten, @OvLap);
WaitForSingleObject(evntserver,INFINITE);
end;.
5) Для создаваемой формы в событие OnCreate запишите следующий программный код:
procedure TForm1.FormCreate(Sender: TObject);
begin
//Создание события на сервере
Evntserver := CreateEvent(Nil, FALSE, FALSE, Nil);
if EvntServer=0 then
begin
ShowMessageFmt('Ошибка %d при создании объекта событие',
[GetLastError]);.
CloseHandle(PipeHandle);
exit; end;
end;.
6) Для события OnClick кнопки «Запустить сервер» запишите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
begin
// Создание именованного канала
PipeHandle := CreateNamedPipe('\\.\Pipe\Jim', PIPE_ACCESS_DUPLEX or FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE or PIPE_READMODE_BYTE, 1, 0, 0, 1000, Nil);
if PipeHandle=INVALID_HANDLE_VALUE then
begin
ShowMessageFmt('Ошибка %d при создании именованного канала',
[GetLastError]);
exit; end;
ShowMessage('Сервер работает. Создайте клиента');
end;.
7) Для события OnClick кнопки «Чтение сообщения» запишите следующий программный код:
procedure TForm1.Button4Click(Sender: TObject);
begin
pFunc1 := @ThreadRead;
hThreadR := CreateThread(nil, 0, pFunc1, nil, 0, ThreadID1);
end;.
8) Для события OnClick кнопки «Передача сообщения» запишите следующий программный код:
procedure TForm1.Button5Click(Sender: TObject);
begin
pFunc2 := @ThreadWrite;
hThreadW := CreateThread(nil, 0, pFunc2, nil, 0, ThreadID2);
end;.
9) Для события OnClick кнопки «Закрыть канал» запишите следующий программный код:
procedure TForm1.Button6Click(Sender: TObject);
begin
if DisconnectNamedPipe(PipeHandle) = False then
begin
ShowMessageFmt('Ошибка %d при закрытии канала', [GetLastError]);
end;
CloseHandle(PipeHandle);
end;.
10) Для события OnClick кнопки «Проверка неблокирующего режима» запишите следующий программный код:
procedure TForm1.Button8Click(Sender: TObject);
begin
ShowMessage('Работа в неблокирующем режиме');
end;.
11) Для события OnClick кнопки «Выход» запишите следующий программный код:
procedure TForm1.Button7Click(Sender: TObject);
begin
Form1.Close;
end;.
12) Откомпилируйте проект.
