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

Содержание

Часть 1

3

Часть 2

22

Часть 1

Задача 1

Постановка задачи:

Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: сервер генерирует прогноз погоды на неделю. Клиент посылает день недели и получает соответствующий прогноз.

Краткое описание алгоритма:

При запуске сервера генерируется прогноз погоды на 7 дней с помощью функции rand(). Клиент отправляет номер дня недели на сервер, сервер обрабатывает информацию и возвращает прогноз погоды клиенту.

Листинг:

Клиент

#include <winsock2.h>

#include <iostream>

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

using namespace std;

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_STREAM,0);

connect(s,(struct sockaddr*) &peer,sizeof(peer));

char buf[255];

char b[255] = {0};

cout<<"Enter the string, please"<<endl;

cin.getline(buf,100,'\n');

send(s,buf,sizeof(buf),0);

if (recv(s,b,sizeof(b),0)!=0)

{

b[strlen(b)]='\0'; //Удаление ненужных символов

// в конце строки

cout<<b<<endl;

}

closesocket(s);

WSACleanup();

return 0;

}

Сервер

#include <winsock2.h>

// Кроме того, подключим уже известные заголовочные файлы :

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

Int main()

{

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested=MAKEWORD(2,2);

WSAStartup(wVersionRequested,&wsaData);

int pogoda[7];

//генерация случайной погоды на 7 дней

srand((unsigned)time(NULL));

for(int i = 0; i < 7; i++)

{

int tmp;

tmp = rand()%2;

if(tmp == 0)

{

pogoda[i] = (rand()%40)*-1;

}

else

{

pogoda[i] = rand()%40;

}

}

SOCKET s = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in local;

local.sin_family=AF_INET;

local.sin_port=htons(1280);

local.sin_addr.s_addr=htonl(INADDR_ANY);

int c=bind(s,(struct sockaddr*)&local,sizeof(local));

int r=listen(s,5);

while (true)

{

char buf[255],res[100],b[255],*Res;

//структура определяет удаленный адрес,

// с которым соединяется сокет

sockaddr_in remote_addr;

int size=sizeof(remote_addr);

SOCKET s2=accept(s,(struct sockaddr*)&remote_addr,&size);

while (recv(s2,b,sizeof(b),0)!=0)

{

int i=0;

i = atoi(b);

sprintf(res,"%d",pogoda[i-1]);

Res=new char[strlen(res)+1];

strcpy(Res,res);

Res[strlen(res)]='\0';

// Посылает данные на соединенный сокет

send(s2,Res,sizeof(Res)-2,0);

}

closesocket(s2);

}

WSACleanup();

}

Задача 2

Постановка задачи:

Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу слово и получает это же слово разбитым на слоги.

Краткое описание алгоритма:

Клиент отправляет слово на сервер, сервер обрабатывает информацию и разбивает слово на слоги, результат возвращается клиенту. Разбиение происходит по выявлению гласных букв в слове, на основе этого и происходит разбиение слова на слоги.

Листинг:

Клиент

#include <stdio.h>

#include <string.h>

#include <winsock2.h>

#include <windows.h>

#include <iostream>

using namespace std;

int main(void)

{

char buf[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, please"<<endl;

cin.getline(buf,100,'\n');

sendto(s, buf, strlen(buf), 0, (struct sockaddr*) &add, t);

int rv = recvfrom(s, b, strlen(b), 0, (struct sockaddr*) &add, &t);

b[rv] = '\0';

cout<<b<<endl;

closesocket(s);

WSACleanup();

return 0;

}

Сервер

#include<winsock2.h>

#include<iostream>

#include<stdlib.h>

#include<process.h>

//функция проверки, является символ гласной или нет

int get_valid(char x)

{

if(x=='a'|| x=='A' || x=='e'|| x=='E'|| x=='i'|| x=='I'|| x=='o'|| x=='O'|| x=='u'|| x=='U'|| x=='y'|| x=='Y')

{

return 1;

}

else

return 0;

}

void main(void)

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested=MAKEWORD(2,2);

err = WSAStartup(wVersionRequested,&wsaData);

// Вызов функции socket( ) выглядит следующим образом:

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; //подставляет подходящий iр

bind(s,(struct sockaddr*) &ad,sizeof(ad));

char b[200];

char buf[2] = {0};

char tmp[200] = {0};

int l;

l = sizeof(ad);

int rv = recvfrom(s, b, strlen(b), 0, (struct sockaddr*) &ad, &l);

b[rv]='\0';

buf[1] = '\0';

int k = 0;

//Цикл проверяющий каждый символ и разбивает слово на слога

for (int i=0; i < rv; i++)

{

if(get_valid(b[i]) && i < rv - 2)

{

buf[0] = b[i];

strcat(tmp, buf);

buf[0] = ' ';

strcat(tmp, buf);

}

else

{

buf[0] = b[i];

strcat(tmp, buf);

}

}

sendto(s, tmp, strlen(tmp), 0, (struct sockaddr*) &ad, l);

closesocket(s);

WSACleanup();

}

Задача 3

Постановка задачи:

Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности клиента реализовать следующим образом: клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак окончания ввода строки - нажатие клавиши "Ввод". Функциональные возможности сервера реализовать следующим образом: сервер, получив эту строку, должен определить длину введенной строки, и, если длина больше 15, то из нее удаляются все цифры. Клиент получает преобразованную строку и количество удаленных цифр.

Краткое описание алгоритма:

Клиент отправляет строку на сервер, сервер проверяет длину строки если она больше 15 символов, то посимвольно сравнивается каждый символ строки на принадлежность его к цифре и записывается в буфер, который потом отправляется клиенту.

Листинг:

Клиент

#include<stdio.h>

#include<iostream>

#include<winsock2.h>

using namespace std;

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err=WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 )

{

return;

}

while (true)

{

SOCKET s=socket(AF_INET,SOCK_STREAM,0);

// указание адреса и порта сервера

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");

connect(s,(sockaddr *)&dest_addr,sizeof(dest_addr));

char buf[100];

cout<<"Enter the string:"<<endl;

fgets(buf,sizeof(buf),stdin);

send(s,buf,100,0);

if (recv(s,buf,sizeof(buf),0)!=0)

{

cout<<"Poluchenaya stroka:"<<endl<<buf<<endl;

}

closesocket(s);

}

WSACleanup();

}

Сервер

#include<stdio.h>

#include<iostream>

#include<winsock2.h>

using namespace std;

DWORD WINAPI ThreadFunc(LPVOID client_socket)

{

SOCKET s2=((SOCKET *) client_socket)[0];

char buf[100];

char buf1[100] = {0};

char tmp[2] = {0};

// send(s2,"Welcome new client!\n",sizeof("Welcome new client!\n"),0);

while(recv(s2,buf,sizeof(buf),0))

{

int k, j=0;

int i;

k=strlen(buf)-1;

//проверка длинны строки

if(k >= 15)

{

//цикл проверки, является символ числом или нет

for(i = 0; i < k; i++)

{

if(!(buf[i] >= 48 && buf[i] <= 57))

{

tmp[0] = buf[i];

tmp[1] = '\0';

strcat(buf1, tmp);

j++;

}

}

buf1[k - (k - j)]='\0';

strcpy(buf,buf1);

}

cout<<buf<<endl;

send(s2,buf,100,0);

}

closesocket(s2);

return 0;

}

int numcl=0;

void print()

{

if (numcl)

printf("%d client connected\n",numcl);

else

printf("No clients connected\n");

}

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 )

{

return;

}

SOCKET s=socket(AF_INET,SOCK_STREAM,0);

sockaddr_in local_addr;

local_addr.sin_family=AF_INET;

local_addr.sin_port=htons(1280);

local_addr.sin_addr.s_addr=0;

bind(s,(sockaddr *) &local_addr,sizeof(local_addr));

int c=listen(s,5);

cout<<"Server receive ready"<<endl;

cout<<endl;

// извлекаем сообщение из очереди

SOCKET client_socket; // сокет для клиента

sockaddr_in client_addr; // адрес клиента(заполняется системой)

int client_addr_size=sizeof(client_addr);

// цикл извлечения запросов на подключение из очереди

while((client_socket=accept(s,(sockaddr *)&client_addr, &client_addr_size)))

{

numcl++;

print();

// Вызов нового потока для обслуживания клиента

CreateThread(NULL,NULL,ThreadFunc,&client_socket,NULL,NULL);

}

}

Задача 4

Постановка задачи:

Осуществить взаимодействие клиента и сервера без установления логического соединения (UDP). Реализовать параллельное соединение с использованием многопоточности. Функциональные возможности выбрать по варианту. Вводится строка. Вывести все ее слова в обратном порядке.

Краткое описание алгоритма:

Клиент отправляет строку на сервер. Сервер считывает слова с конца строки и пишет их в буфер, таким образом слова выводятся в обратном порядке.

Листинг:

Клиент

include <winsock2.h>

#include <iostream>

using namespace std;