лабы / кслаба2
.docxМинистерство образования Республики Беларусь
Министерство образования Республики Беларусь
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра эконмической информатики
Лабораторная работа №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
}