Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
7.98 Mб
Скачать

1.2. Алгоритм работы Winsock- приложения по протоколу tcp

Алгоритм передачи информации между клиентом и сервером по протоколу TCP изображен на рис. 1.

2. Задание по лабораторной работе

2.1. Создание серверного приложения

Создать серверное приложение, имеющее вид, представленный на рис. 2.

Серверное приложение должно выполнять следующие действия.

1) Подключить библиотеку Winsock (сделать ссылку на библиотеку в списке подключаемых модулей - uses). Инициализировать интерфейс сокетов с помощью функции WSAStartup.

2) Создать сокет с помощью функции socket.

Клиент

WSAStartup

socket

Сервер

WSAStartup

bind

socket

Установление соединения

Listen

connect

accept

Передача сообщения от клиента к серверу

send

recv

Передача ответа от сервера к клиенту

recv

send

CloseSocket

WSACleanup

WSACleanup

CloseSocket

Рис. 1. Алгоритм работы клиента и сервера по передаче пакетов по протоколу TCP

Рис. 2

3) Настроить сокет с помощью функции setsockopt (необязательно).

4) Объявить с помощью функции Bind, на каком порту сервер будет принимать данные и от кого.

  1. Перевести сокет в режим пассивного ожидания с помощью функции listen.

  2. Блокировать выполнение программы до тex пop, пока не поступит запрос на установление соединения с помощью функции accept. Функция accept возвращает дескриптор сокета, на котором будет выполняться прием-передача данных.

  3. Получить данные от любого клиента с помощью функции recv. Вывести на экран полученное сообщение. Возвратить полученное сообщение клиенту в эхорежиме с помощью функции send.

  4. Закрыть сокет с помощью функции CloseSocket.

  5. Прекратить работу с интерфейсом сокетов с помощью функции WSACleanup.

Для выполнения перечисленных действий в событие OnCiick командной кнопки «Запуск сервера» запишите следующий программный код:

procedureTForm1.Bulton1Click(Sender: TObject);

VAR

ServerSocket,ClientSocket: TSocket; {Сокет}

Addr_server, addr_client: TSockAddr; {адреса сокета сервера и сокета отправителя}

ret: Integer; {результат работы функций}

bufr: Array [1..90] of char; {буфер для получаемых от клиента данных}

msgstring: Array [1..90] of char; {буфер для вывода сообщения на экран}

bufs: Array [1..80] of char; {буфер для передачи ответа клиенту} wsd: WSADATA; {Структура WSADATA, требуется для инициализации интерфейса сокетов}

size_addr: Integer; {размер структуры TSockAddr}

on: Integer;

begin

//Инициализация интерфейса сокетов

If WSAStartup(MAKEWORD(2,2),wsd)<>0

then ShowMessageFm(‘Ошибка %d при инициализации интерфейса

сокетов’, [WSAGetLastError])

else

begin

// Создание сокета сервера

ServerSocket:=socket(AF_INET.SOCK_STREAM, 0);

If ServerSocket=INVALID_SOCKET

then ShowMessageFmt('Ошибка %d при создании сокета',

[WSAGetLastError])

else

begin

// Запись в поля переменной local адреса и номера порта сервера,

// по которому сервер будет принимать датаграммы

Addr_server.sin_family :=AF_INET;

Addr_server.sin_port := htons(2000);

Addr_server.sin_addr.S_addr:= htonl(INADDR_ANY);

// настройка опций сокета

on := I;

ret:=setsockopt(ServerSocket, SOL_SOCKET,SO_REUSEADDR, @on,

sizeof(on));

If ret=SOCKET_ERROR then

begin

ShowMessageFmt('Ошибка %d при настройке сокета'. [WSAGetLastError])

CloseSocket(ServerSocket);

end

else

begin

// привязка адреса и номера порта к сокету сервера

// т.е. сервер ожидает данные от любого клиента (INADDR_ANY)

// если данные передаются на порт 2000

ret:=bind(ServerSocket, addr_server, sizeof(addr_server));

If ret=SOCKET_ERROR then

begin

ShowMessageFmt(‘Ошибка %d при объявлении сокета ',

[WSAGetLastError]);

CloseSocket(ServerSocket);

end

else

begin

ret:= listen(ServerSocket,5);

If ret=SOCKET_ERROR then

Begin

ShowMessageFmt(‘Ошибка %d при вызове listen', [WSAGetLastError]);

CloseSocket (ServerSocket);

end

else

begin

size_addr:=Sizeof(addr_client);

ClientSocket:= accept(ServerSocket, @addr_client, @size_addr);

If ClientSocket=SOCKET_ERROR then

begin

ShowMessageFmt('Ошибка %d при вызове accept', [WSAGetLastError]);

CloseSocket(ServerSocket);

end

else

begin

ZeroMemory(@bufr, sizeof(bufr));

// Получение данных от клиента

ret := recv(ClientSocket, bufr, sizeof(bufr), 0);

If ret=SOCKET_ERROR then

begin

ShowMessageFmt('Ошибка %d при получении данных',

[WSAGetLastError]);

CloseSocket(ServerSocket);

end

else

begin

// Формирование сообщения msgstring для вывода на экран

StrCopy(@msgstring, ‘Получено сообщение:');

StrCat(@msgstring. @bufr);

StrCat(@msgstring,' от');

StrCat(@msgstring, inet_ntoa(addr_client.sin_addr));

ShowMessage(msgstring);

end;

StrCopy(@bufs, @bufr);

// Пересылка эхоответа клиенту

Ret:=send(ClientSocket, bufs, sizeof(buls), 0);

if ret=SOCKET_ERROR then

begin

ShowMessageFmt('Ошибка %d при передаче данных',

[WSAGetLastError]);

CloseSocket(ServerSocket);

end;

end;

// закрытие сокета

CloseSocket(ServerSocket);

end;

end;

end;

end;

WSACleanup;

End;

end;.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]