Федосенко 1 лаба. Лабораторная работа 2 Создание последовательного сервера без установления логического соединения (udp)
Скачать 57.16 Kb.
|
Министерство образования Республики Беларусь Учреждение образования Белорусский государственный университет информатики и радиоэлектроники Факультет инженерно-экономический Кафедра экономической информатики Лабораторная работа №2 «Создание последовательного сервера без установления логического соединения (UDP)» Вариант 13 Выполнил: Яковенко Ф.С. Группа 072303 Проверил: Федосенко В. А. Минск 2021 Цель работы – изучить методы создания серверов, используя алгоритм последовательной обработки запросов. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ Контрольные вопросы: Помимо посылаемых данных каждое UDP-сообщение содержит номер порта-приёмника и номер порта-отправителя, делая возможным для программ UDP на машине-получателе доставлять сообщение соответствующему реципиенту, а для получателя посылать ответ соответствующему отправителю. Дейтаграмма – это блок информации, передаваемый посредством протокола по компьютерной сети без предварительного установления соединения. В отличие от протокола TCP, UDP-протокол не обеспечивает надёжную передачу данных. Отсутствует обратная связь между отправителем и получателем, не предусмотрена обработка исключительных ситуаций. Как следствие – данные, пересылаемые с помощью этого протокола могут быть утеряны, продублированы, отправлены в неправильной последовательности или раньше, чем получатель может их обрабатывать. Функции sendto() и recvfrom() имеют параметры, указывающие на адрес отправления данных и адрес, с которого мы их получили, соответственно. Это необходимо при использовании данного протокола передачи данных, так как здесь не устанавливается предварительно соединение, как в случае с использованием протокола TCP, где использовались функции recv() и send(), не имеющие таких параметров. В таком случае в буфер помещается столько данных, сколько возможно при его размере, а оставшаяся часть дейтаграммы сбрасывается в подсистему сборки мусора и безвозвратно теряется. Функция recvfrom() возвращает значение SOCKET ERROR. Примерами сетевых приложений, использующих UDP, являются NFS(Network File System - сетевая файловая система) и SNMP(Simple Network Management Protocol -простой протокол управления сетью). Сокеты дейтаграмм очень полезны для пересылки данных, состоящих из отдельных пакетов или записей. Они также являются удобным средством рассылки циркулярных пакетов по нескольким адресам одновременно. Протокол UDP обеспечивает эффективность на быстрых сетях с короткими соединениями. Задание: 13. Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает строку символов, сервер возвращает содержащиеся в ней цифры. Серверная часть: #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #pragma comment (lib, "wsock32.lib") #include #include #include #include #include #include #include #include using namespace std; int main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); SOCKET s; s = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in ad; ad.sin_port = htons(1024); ad.sin_family = AF_INET; ad.sin_addr.s_addr = 0; bind(s, (struct sockaddr*)&ad, sizeof(ad)); cout << "Server waiting for data\n"; char b1[200], b2[200], b3[200], tmp = '\0'; int l; string x; l = sizeof(ad); recvfrom(s, b1, sizeof(b1), 0, (struct sockaddr*)&ad, &l); cout << "\nServer recieved data: " << b1 << endl; string res; char * Res; for (int i = 0; i < strlen(b1); i++) { if (b1[i] <= 57 && b1[i] >= 48) { res += b1[i]; } } Res = new char[res.length() + 1]; Res[res.length() + 1] = '\0'; for (int i = 0; i <= res.length(); i++) { Res[i] = res[i]; } cout << "\nServer sending data - " << res; sendto(s, Res, sizeof(res), 0, (struct sockaddr*)&ad, l); closesocket(s); WSACleanup(); } Клиентская часть: #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #pragma comment (lib, "wsock32.lib") #include #include #include #include #include #include #include using namespace std; int main() { char buf1[100], b[100]; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return 0; } SOCKET s; s = socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in add; add.sin_family = AF_INET; add.sin_port = htons(1024); add.sin_addr.s_addr = inet_addr("127.0.0.1"); int t; t = sizeof(add); cout << "Enter the string: "; cin.getline(buf1, 100, '\n'); sendto(s, buf1, sizeof(buf1), 0, (struct sockaddr*)&add, t); int rv = recvfrom(s, b, sizeof(b), 0, (struct sockaddr*)&add, &t); cout << "\nClient recieved data: " << b << endl << endl; closesocket(s); WSACleanup(); } Скриншоты выполнения индивидуального задания: Работа сервера: Работа клиента: |