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

Министерство образования Республики Беларусь

Учреждение образования

Белорусский государственный университет информатики и

радиоэлектроники

Кафедра экономической информатики

КОНТРОЛЬНАЯ РАБОТА

по дисциплине: «Компьютерные сети»

на тему: «Расчет конфигурации сети Ethernet»

Вариант 1

Минск 2009

Часть 1

Задача 1.

Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает два числа серверу и одну из математических операций: "*", "/", "+", "-" ,- сервер соответственно умножает, делит, складывает либо вычитает эти два числа и ответ посылает ответ назад клиенту.

Нам необходимо написать две программы серверную и клиентскую.

В серверной программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем сокету адрес и порт, используя функцию bind. Далее ожидаем установки соединения с клиентом, для чего используем функцию listen. После прихода с клиента предложения о соединении, принимаем его, используя функцию accept. И начинаем принимать данные с клиента, используя функцию recv. Принятые данные обрабатываем, исходя из условия задачи, и отсылаем результат обработки, используя функцию send. В конце программы закрываем сокет, при помощи функции closesocket, и прекращаем работу WinSock API, используя функцию WSACleanup.

В клиентской программе инициализируем WinSock API, используя функцию WSAStartup. Создаем сокет, использующий протокол TCP, при помощи функции socket. Устанавливаем соединение с сервером, используя функцию connect. Считываем данные с потока входа, при помощи функции std::cin.getline, и отсылаем их на сервер, используя функцию send. Получаем результат с сервера, используя функцию recv, и выводим его на экран, посредством функции 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_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 res[255],b[255];

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

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

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 i1 = 0;

int i2 = 0;

if (strchr(b, '+') != 0) {

i1 = atoi(strtok(b, "+"));

i2 = atoi(strtok(0, "+"));

itoa(i1 + i2, res, 10);

} else if (strchr(b, '-') != 0) {

i1 = atoi(strtok(b, "-"));

i2 = atoi(strtok(0, "-"));

itoa(i1 - i2, res, 10);

} else if (strchr(b, '*') != 0) {

i1 = atof(strtok(b, "*"));

i2 = atof(strtok(0, "*"));

itoa(i1 * i2, res, 10);

} else if (strchr(b, '/') != 0) {

i1 = atof(strtok(b, "/"));

i2 = atof(strtok(0, "/"));

itoa(i1 / i2, res, 10);

}

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

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

}

closesocket(s2);

}

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

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

char buf[255],b[255];

std::cout<<"Enter two numbers and mathematical operation (+, -, *, or /) between them. Example: 12*11"<<std::endl;

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

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

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

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

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

std::cout<<b<<std::endl;

std::cin.get();

}

closesocket(s);

WSACleanup();

return 0;

}