Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерные сети контрольная работа.doc
Скачиваний:
265
Добавлен:
01.04.2014
Размер:
254.46 Кб
Скачать

Задача 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;

}