
Задача 4.
Осуществить взаимодействие клиента и сервера без установления логического соединения (UDP). Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности: водится текст и некоторое слово. Вывести только те предложения из текста, которые содержат данное слово.
Нам необходимо написать две программы серверную и клиентскую.
Алгоритм серверной программы совпадает с алгоритмом, описанным в задаче 2. За исключением приема данных с клиента их обработки и отправки назад. Вышеописанная работа произведена в отдельной функции с именем StringAnalizing. Она вызывается в отдельном потоке после создания сокета, используя функцию _beginthread.
Алгоритм клиентской программы совпадает с алгоритмом, описанным в задаче 2.
#include <winsock2.h>
#include <process.h> /* _beginthread, _endthread */
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")
void StringAnalizing(void* s) {
char b[210];
sockaddr_in ad;
ad.sin_family = AF_INET;
ad.sin_port = htons(1280);
ad.sin_addr.s_addr = htonl(INADDR_ANY);
int j=sizeof(ad);
bind((SOCKET)s,(LPSOCKADDR)&ad, j);
if (recvfrom((SOCKET)s,b,sizeof(b),0,(LPSOCKADDR) &ad, &j)!=0) {
std::cout<<"f"<<std::endl;
char *delimiter = "#$#";
char *text = strtok(b, delimiter);
char *world = strtok(NULL, delimiter);
char *sentence = strtok(text, ".");
char send[210];
send[0] = '\0';
char *s1 = send;
while (sentence != NULL) {
if (strstr(sentence, world)) {
s1 = strcat(s1, sentence);
s1 = strcat(s1, ".\n");
}
sentence = strtok(NULL, ".");
}
int len = strlen(send) + 1;
sendto((SOCKET)s,send,len,0,(LPSOCKADDR) &ad, j);
}
}
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
SOCKET s = socket(AF_INET, SOCK_DGRAM,0);
while(true) {
_beginthread(StringAnalizing,0,(void*)s);
}
// closesocket(s);
WSACleanup();
return 0;
}
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
struct sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(1280);
peer.sin_addr.s_addr=inet_addr("127.0.0.1");
SOCKET s=socket(AF_INET,SOCK_DGRAM,0);
int t=sizeof(peer);
char text[210];
char world[10];
std::cout<<"Enter text"<<std::endl;
std::cin.getline(text, sizeof(text), '\n');
std::cout<<"Enter world"<<std::endl;
std::cin>>world;
std::cin.get();
char *send = strcat(text, "#$#");
send = strcat(send, world);
sendto(s,send,strlen(send) + 1,0,(LPSOCKADDR) &peer, t);
if (recvfrom(s,text,sizeof(text),0,(LPSOCKADDR)&peer,&t)!=0) {
std::cout<<text<<std::endl;
std::cin.get();
}
closesocket(s);
WSACleanup();
return 0;
}
Задача 7.
Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу строку, сервер возвращает эту же строку, но гласные в ней должны быть в верхнем регистре.
Нам необходимо написать две программы серверную и клиентскую.
Алгоритм серверной программы совпадает с алгоритмом, описанным в задаче 2. За исключением приема данных с клиента их обработки и отправки назад. Вышеописанная работа произведена в отдельной функции с именем StringAnalizing. Создается пул из 5 потоков, в которых эта функция вызывается. Создание потоков осуществляется при помощи функции _beginthread.
Алгоритм клиентской программы совпадает с алгоритмом, описанным в задаче 2.
#include <winsock2.h>
#include <process.h> /* _beginthread, _endthread */
#include <iostream>
#pragma comment(lib,"Ws2_32.lib")
int count = 0;
void StringAnalizing(void* s) {
char b[210];
char *vowels = "eioau";
int difference = 'A' - 'a';
sockaddr_in ad;
ad.sin_family = AF_INET;
ad.sin_port = htons(1280);
ad.sin_addr.s_addr = htonl(INADDR_ANY);
int j=sizeof(ad);
bind((SOCKET)s,(LPSOCKADDR)&ad, j);
if (recvfrom((SOCKET)s,b,sizeof(b),0,(LPSOCKADDR) &ad, &j)!=0) {
for (int i = 0; i < strlen(b); i++) {
if (strchr(vowels, *(b + i)) != 0) {
*(b + i) += difference;
}
}
// Посылает данные на соединенный сокет
sendto((SOCKET)s,b,sizeof(b),0, (struct sockaddr*)&ad, j);
}
count--;
}
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData);
if(err != 0) return -1;
SOCKET s = socket(AF_INET, SOCK_DGRAM,0);
while(true) {
if (count < 5) {
std::cout<<++count<<" threads are working now."<<std::endl;
_beginthread(StringAnalizing,0,(void*)s);
}
}
// closesocket(s);
WSACleanup();
return 0;
}
#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;
}