Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / кслаба2

.docx
Скачиваний:
16
Добавлен:
28.03.2021
Размер:
18.39 Кб
Скачать

Министерство образования Республики Беларусь

Министерство образования Республики Беларусь

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра эконмической информатики

Лабораторная работа №2

“Создание последовательного сервера без установления логического соединения UDP”

Вариант 7

Выполнила: Студентка группы

972303

Рушева Маргарита

Владиславовна

Проверил: Корбит Павел

Анатольевич

Минск, 2020

Индивидуальное задание

Цель работы – изучить методы создания серверов без установления логического соединения UDP, используя алгоритм последовательной обработки запросов.

Задание. Клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак окончания строки – нажатие клавиши “Ввод”. Сервер, получив эту строку, должен определить длину введенной строки, и, если длина больше 15, то из нее удаляются все цифры. Клиент получает преобразованную строку и количество удаленных цифр.

Код программы

Сервер:

#include<iostream> // потоки ввода-вывода

#include<winsock2.h> // работа с сокетами

#pragma warning (disable: 4996)

#pragma comment(lib, "wsock32.lib")

using namespace std;

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

if (err != 0) // если ошибка - завершение работы

{

return;

}

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета потока, протокол UDP

SOCKADDR_IN local_addr;

local_addr.sin_family = AF_INET; // тип адреса

local_addr.sin_port = htons(1280); // номер порта

local_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

bind(s, (SOCKADDR*)&local_addr, sizeof(local_addr)); // связывание сокета с локальным адресом

char buf[100];

int size = sizeof(local_addr);

recvfrom(s, buf, sizeof(buf), 0, (SOCKADDR*)&local_addr, &size); // приём строки

cout << "accepted string : " << buf << endl;

char newbuf[100];

int count = 0;

if (strlen(buf) > 15)

{

int i = 0;

int j = 0;

while (i < strlen(buf))

{

if (buf[i] >= '0' && buf[i] <= '9')

{

count++;

}

else

{

newbuf[j] = buf[i];

j++;

}

i++;

}

newbuf[j] = '\0';

}

cout << "new string : " << newbuf << endl;

cout << "count : " << count;

sendto(s, newbuf, sizeof(newbuf), 0, (SOCKADDR*)&local_addr, sizeof(local_addr)); // отправка ответа

sendto(s, (char*)&count, sizeof(count), 0, (SOCKADDR*)&local_addr, sizeof(local_addr)); // отправка ответа

closesocket(s); // закрытие сокета

}

Клиент:

#include<stdio.h>

#include<iostream>

#include<winsock2.h>

using namespace std;

#pragma warning (disable: 4996)

#pragma comment(lib, "wsock32.lib")

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(2, 2);

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

// если ошибка - завершение работы

if (err != 0)

{

return;

}

while (true)

{

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета, протокол UDP

sockaddr_in dest_addr;

dest_addr.sin_family = AF_INET; // тип адреса

dest_addr.sin_port = htons(1280); // номер порта

dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

char buf[100];

cout << "\nvvedite:" << endl;

fgets(buf, sizeof(buf), stdin);

sendto(s, buf, sizeof(buf), 0, (SOCKADDR*)&dest_addr, sizeof(dest_addr));

int size = sizeof(dest_addr);

char newbuf[100];

int count;

recvfrom(s, newbuf, sizeof(newbuf), 0, (SOCKADDR*)&dest_addr, &size); // получение ответа

recvfrom(s, (char*)&count, sizeof(count), 0, (SOCKADDR*)&dest_addr, &size); // получение ответа

cout << "accepted string : " << newbuf;

cout << "count : " << count;

closesocket(s); // закрытие сокета

}

WSACleanup(); // завершение работы с WinSock API

}

Соседние файлы в папке лабы