Задача 2.
Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу строку, сервер возвращает эту же строку, но гласные в ней должны быть в верхнем регистре.
Нам необходимо написать две программы серверную и клиентскую.
В серверной программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол UDP, при помощи функции socket. Устанавливаем сокету адрес и порт, используя функцию bind. Далее ожидаем установки соединения с клиентом, для чего используем функцию listen. Принимаем данные с клиента, используя функцию recvfrom. Принятые данные обрабатываем, исходя из условия задачи, и отсылаем результат обработки, используя функцию sendto. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup.
В клиентской программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол UDP, при помощи функции socket. Устанавливаем соединение с сервером, используя функцию connect. Считываем данные с потока входа, при помощи функции std::cin.getline, и отсылаем их на сервер, используя функцию sendto. Получаем результат с сервера, используя функцию recvfrom, и выводим его на экран, посредством функции std::cout. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup.
#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
int main() {
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);
SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(1280);
local.sin_addr.s_addr=htonl(INADDR_ANY);
int size = sizeof(local);
int c=bind(s,(struct sockaddr*)&local,size);
int r=listen(s,5);
char *vowels = "eioau";
int difference = 'A' - 'a';
while (true) {
char res[255],b[255];
while (recvfrom(s,b,sizeof(b),0, (sockaddr *) &local, &size)!=0) {
for (int i = 0; i < strlen(b); i++) {
if (strchr(vowels, *(b + i)) != 0) {
*(b + i) += difference;
}
}
// Посылает данные на соединенный сокет
sendto(s,b,sizeof(b),0, (struct sockaddr*)&local, size);
}
closesocket(s);
}
WSACleanup();
}
#include <winsock2.h>
#include <iostream>
#include <stdlib.h>
#pragma comment(lib,"Ws2_32.lib")
int main() {
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);
struct sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(1280);
// т.к. клиент и сервер на одном компьютере,
// пишем адрес 127.0.0.1
peer.sin_addr.s_addr=inet_addr("127.0.0.1");
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
int size = sizeof(peer);
char buf[255],b[255];
std::cout<<"Enter string."<<std::endl;
std::cin.getline(buf,100,'\n');
sendto(s,buf,sizeof(buf),0, (sockaddr *) &peer,size);
if (recvfrom(s,b,sizeof(b),0, (sockaddr *) &peer, &size)!=0) {
b[strlen(b)]='\0'; //Удаление ненужных символов
// в конце строки
std::cout<<b<<std::endl;
std::cin.get();
}
closesocket(s);
WSACleanup();
return 0;
}

