- •«Дальневосточный федеральный университет»
- •Школа естественных наук материалы практических занятий
- •Определение установок сетевого адаптера
- •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.2.4. Передача данных
function sendto(
s: TSocket;
var buf; len, flags: Integer;
var addrto: TSockAddr;
tolen: Integer
): Integer; stdcall;.
Первый параметр s определяет сокет для отправки данных.
Второй параметр - buf, указывает на символьный буфер, содержащий данные для отправки.
Третий - len, задает число отравляемых из буфера символов.
Параметр - flags, может принимать значения 0, MSG_DONTROUTE, MSG_ООВ или результат логического ИЛИ над любыми из этих параметров. При указании флага MSG_DONTROUTE транспорт не будет маршрутизировать отправляемые пакеты. Обработка этого запроса остается на усмотрение базового протокола (например, если транспорт не поддерживает этот параметр, запрос игнорируется). Флаг MSG_ООВ указывает, что данные должны быть отправлены вне полосы (out of band), то есть срочно.
Параметр addrto - указатель на структуру SockAddr_in с адресом принимающей рабочей станции.
Параметр tolen - длина структуры addrto.
При успешном выполнении функция sendem вернет количество переданных байт, иначе - ошибку SOCKET_ERROR.
1.2.5. Получение данных по сети
function recvfrom(
s: TSocket;
var Buf; len, flags: Integer;
var from: TSockAddr;
var fromlen: Integer
): Integer; stdcall;
Первый параметр s определяет сокет для приема данных.
Второй параметр - buf, является символьным буфером и предназначен для полученных данных, а len указывает число принимаемых байт или размер буфера buf.
Параметр - flags, может принимать значения 0, MSG_РЕЕК, MSG_OOB или результат логического ИЛИ над любыми из этих параметров. Разумеется, 0 означает отсутствие особых действий. Флаг MSG_PEEK указывает, что доступные данные должны копироваться в принимающий буфер и при этом оставаться в системном буфере. По завершении функция также возвращает количество ожидающих байт. Считывать сообщения таким образом не рекомендуется. Флаг MSG_OOB означает, что пришли срочные данные.
Параметр from - указатель на структуру SockAddr_in для данного протокола. После выполнения функции параметр from будет содержать адрес рабочей станции, которая отправляет данные.
Параметр fromlen - длина параметра from в байтах.
1.2.6. Закрытие сокета
function closesocket(
s: Tsocket
): Integer; stdcall;,
где s - дескриптор сокета.
Функция закрывает одну сторону в соединении.
1.2.7. Деинициализация интерфейса сокетов
function WSACleanup: Integer; stdcall;.
Функция уведомляет библиотеку Winsock, что приложение закончило работу с сокетами.
1.3. Алгоритм работы Winsock-приложения по протоколу UDP
Алгоритм работы Winsock-приложения, работающего по протоколу UDP, приведен на рис. 1.
2. Задание по практическому занятию
2.1. Создание серверного приложения
При реализации серверного приложения выполнить следующие пункты.
1) Создать Серверное приложение, имеющее вид, представленный на рис. 2.
2) Подключить библиотеку сокетов. Для этого в блок uses добавить библиотеку Winsock:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Winsock;
Инициализировать интерфейс сокетов с помощью функции WSAStartup.
Создать сокет с помощью функции socket.
Объявить с помощью функции Bind, на каком порту сервер будет принимать данные и от кого.
Получить данные от любого клиента с помощью функции recvfrom.
Вывести на экран полученное сообщение.
Клиент
Сервер
WSAStartup
WSAStartup
socket
socket
Передача
сообщения от клиента к серверу
bind
recvfrom
sendto
Передача
ответа от сервера к клиенту
sendto
CloseSocket
WSACleanup
Рис.
1. Алгоритм работы клиента и сервера по
передаче датаграмм в эхорежиме
WSACleanup
CloseSocket
recvfrom
Рис. 2
Возвратить полученное сообщение клиенту в эхорежиме с помощью функции sendto.
Закрыть сокет с помощью функции CloseSocket и прекратить работу с интерфейсом сокетов с помощью функции WSACleanup.
Для выполнения перечисленных действий событие OnClick командной кнопки «Запуск сервера» может быть представлено следующим программным кодом:
procedure TForm1.Button1C1ick( Sender: TObject);
VAR
s: TSocket; {Сокет}
local_socket, sender_socket: TSockAddr; {адреса сокета сервера и сокета отправителя}
ret: Integer; {результат работы функций}
bufr: Array [1..90] of char; {буфер для получаемых от клиента данных}
msgstring: Array [1..90] of char; {буфер для вывода сообщения на экран}
bufs: Array [1..80] of char; {буфер для передачи ответа клиенту} wsd: WSADAТА;{Структура WSADATA, требуется для инициализации интерфейса сокетов}
size_socket: Integer; {размер структуры TSockAddr}
begin
//Инициализация интерфейса сокетов
If WSAStartup(MAKEWORD(2,2),wsd)<>0
then ShowMessageFmt('Ошибка %d при инициализации интерфейса сокетов', [WSAGetLastError])
else
begin
// Создание сокета сервера
S:=socket(AF_INET,SOCK_DGRAM,0);
If s=INVALID_SOCKET
Then ShowMessageFmt('Ошибка %d при создании
Сокета',[WSAGetLastError]) else
Begin
// Запись в поля переменной local адреса и номера порта сервера,
// по которому сервер будет принимать датаграммы
Local_socket. Sin_family :=AF_INET;
Local_socket.sin_port := htons(2000);
Local_socket.sin_addr.S_addr:=htonl(lNADDR_ANY);
// привязка адреса и номера порта к сокету сервера
// т. е. сервер ожидает данные от любого клиента (INADDR_ANY)
// если данные передаются на порт 2000
ret := bind(s,local_socket, sizeof(local_socket));
If ret=SOCKET_ERROR then
begin
ShowMessageFmt('Ошибка %d при объявлении сокета',
[WSAGetLastError]);
CloseSocket(s);
end
else
begin
ret:=0;
size_socket:= Sizeof(sender_ socket);
ZeroMemory(@bufr, sizeof(bufr));
// Получение данных от клиента
ret := recvfrom(s, bufr, sizeof(bufr), 0, sender_socket, size_socket);
If ret=SOCKET_ERROR then
ShowMessageFmt('Ошибка %d при получении данных ',
[WSAGetLastError])
else
begin
// Формирование сообщения msgstring для вывода на экран
StrCopy(@msgstring, 'Получено сообщение:');
StrCat(@msgstring, @bufr);
StrCat(@msgstring,' от');
StrCat(@msgstring,inet_ntoa(sender_socket.sin_addr));
ShowMessage(msgstring);
end;
StrCopy(@bufs, @bufr);
// Пересылка эхоответа клиенту
ret :=sendto(s, bufs, sizeof(bufs), 0, sender_socket, sizeof(sender socket));
If ret=SOCKET_ERROR then
begin
ShowMessageFmt('Ошибка %d при передаче данных ',
[WSAGetLastError]);
CloseSocket(s);
end;
// закрытие сокета
CloseSocket(s);
end; end;
WSACleanup;
end;
end;.
