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

Клиентское приложение:

#include <winsock2.h>

#include <iostream>

#include <string>

#include <stdlib.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main() {

// максимальный номер версии WinSock

WORD wVersionRequested;

// структура для WSAStartup

WSADATA wsaData;

// инициализируем WinSock API

wVersionRequested=MAKEWORD(2,2);

WSAStartup(wVersionRequested,&wsaData);

// Создаем структуру данных соединения

struct sockaddr_in peer;

// Поле sin_family всегда имеет значение AF_INET

peer.sin_family = AF_INET;

// Обращаемся через порт 1280

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

string sBuff;

char b[255];

cout<<"Enter the word: ";

getline(cin, sBuff);

// Отправляем строку на сервер для обработки

send(s, sBuff.c_str(), sBuff.length() + 1, 0);

// Получаем ответ от сервера

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

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

cout<<b<<endl;

}

// Завершаем работу сокета

closesocket(s);

// Завершаем использование WinSock DLL

WSACleanup();

return 0;

}Результаты тестирования:

Рисунок 1 – Запущено серверное приложение

Рисунок 2 – Результат работы клиентского приложения

Задача №2

Осуществить взаимодействие клиента и сервера на основе протокола UDP. Функционирование клиента и сервера реализовать следующим образом: клиент посылает серверу дату в формате ДД.ММ.ГГ, сервер определяет существует ли она и возвращает "истина", если дата корректна, в противном случае - "ложь".

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

Серверное приложение:

// Максимальный номер версии WinSock

// Структура для WSAStartup

// Инициализируем WinSock API

// Создаем серверный сокет, использующий протокол UDP

// Создаем структуру данных соединения

// Поле sin_family всегда имеет значение AF_INET

// Слушаем 1280 порт

// Слушаем все сетевые соединения

// Связываем сокет с соединением

// Принимаем данные от приложения-клиента

// Проверяем введенную дату, если дата существует выводим TRUE, в противном случае FALSE

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

// Завершаем работу сокета

// Завершаем использование WinSock DLL

Клиентское приложение:

// Максимальный номер версии WinSock

// Структура для WSAStartup

// Инициализируем WinSock API

// Создаем структуру данных соединения

// Поле sin_family всегда имеет значение AF_INET

// Обращаемся через порт 1280

// Т.к. клиент и сервер на одном компьютере, пишем адрес 127.0.0.1

// Создаем клиентский сокет, использующий протокол UDP

// Подключаемся к серверу

// Отправляем строку на сервер для обработки

// Получаем ответ от сервера

// Завершаем работу сокета

// Завершаем использование WinSock DLL

Листинги с пояснениями:

Серверное приложение:

#define _CRT_SECURE_NO_DEPRECATE 1

#include <iostream>

#include <string>

#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()

{

// максимальный номер версии WinSock

WORD wVersionRequested;

// структура для WSAStartup

WSADATA wsaData;

// инициализируем WinSock API

wVersionRequested = MAKEWORD(2,2);

int err = WSAStartup(wVersionRequested, &wsaData);

// Создаем серверный сокет, использующий протокол UDP

SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

// Создаем структуру данных соединения

struct sockaddr_in ad;

// Поле sin_family всегда имеет значение AF_INET

ad.sin_family = AF_INET;

// Слушаем 1280 порт

ad.sin_port = htons(1280);

// Слушаем все сетевые соединения

ad.sin_addr.s_addr = htonl(INADDR_ANY);

// Принимаем данные от приложения-клиента

char buf[20];

int monthes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int j=sizeof(ad);

//Связывание сокета с локальным адресом

int c=bind((SOCKET)s,(LPSOCKADDR)&ad, j);

//Если получены какие-то данные, то обработаем их

if (recvfrom((SOCKET)s,(LPSTR)&buf,sizeof(buf),0,(LPSOCKADDR) &ad, &j)!=0)

{

printf("\nDate received: %s",buf);

char cday[2];

cday[0]=buf[0];

cday[1]=buf[1];

int day=atoi(cday);

char cmonth[2];

cmonth[0]=buf[3];

cmonth[1]=buf[4];

int month=atoi(cmonth);

strcpy(buf,"FALSE");

if(month>12)

sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);

else if(day>monthes[month-1])

sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);

else

{

strcpy(buf,"TRUE");

sendto((SOCKET)s,(LPCSTR)&buf,sizeof(buf),0,(LPSOCKADDR)&ad,j);

}

}

// Завершаем работу сокета

closesocket(s);

// Завершаем использование WinSock DLL

WSACleanup();

return 0;

}