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

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

}