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

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

#include <winsock2.h>

#include <windows.h>

#include <process.h> /* _beginthread, _endthread */

#include <string.h>

#include<stdio.h>

//Функция, обслуживающая запросы клиентов

void ServClients(void* s){

//Буфер для получения/отправки данных

char res[1024];

char f[20];

strcpy(f,"NO NUMBERS");

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

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

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

int found=0;

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

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

{

for(int i=0;i<strlen(res);i++)

if(isdigit(res[i]) && isdigit(res[i+1]))

{

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

found=1;

break;

}

if(!found)

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

}

}

//Главная функция программы

int main(){

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(2,2);

//Инициализация библиотеки WinSock

err = WSAStartup(wVersionRequested, &wsaData);

if(err != 0) return -1;

//Создание сокета UDP

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

//Считывание оборудования из файла

while(true){

_beginthread(ServClients,0,(void*)s);

}

WSACleanup();

return 0;

}

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

#include <winsock2.h>

#include <iostream>

#include<stdio.h>

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

using namespace std;

//Главная функция программы

int main()

{

char buff[100];

//Инициализация библиотеки WinSock

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(2,2);

err = WSAStartup(wVersionRequested, &wsaData);

if(err != 0) return -1;

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

//Создание сокета UDP

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

int t=sizeof(peer);

//Ввод пользователем числа строки

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

gets(buff);

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

sendto(s,(LPCSTR)&buff,sizeof(buff),0,(LPSOCKADDR)&peer,t);

//Если от сервера был получен ответ, то проанализируем его

if (recvfrom(s,buff,sizeof(buff),0,(LPSOCKADDR)&peer,&t)!=0)

{

//Печать результата обработки строки

cout << buff<<endl;

closesocket(s);

}

//Очистка структур WinSock

WSACleanup();

return 0;

}

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

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

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

Задача №8

В протоколе отправки SMS-сообщений ограничить частоту отправки сообщений с одного IP адреса по времени. Добавить команду sms (без параметров), которая выводила б правила пользования услугой.

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

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

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

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

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

// Создаем серверный сокет

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

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

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

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

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

// Инициализируем прослушивание сокета

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

// Адрес клиента

// Сокет для клиента

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

// Получаем правила пользования услугой sms

// Поучаем сообщение

// Записываем в файл новое сообщение

// При попытке послать еще одно сообщение, получаем отказ

// Отправляем результат клиенту

// Завершаем работу клиентского сокета

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

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

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

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

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

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

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

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

// Создаем клиентский сокет

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

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

// Отправляем серверу номер телефона

// Пока пользователь не введет команду "quit", отправляем строку на сервер для обработки

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

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

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

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

#include <iostream.h>

#include <afx.h>

#include <winsock2.h>

#include <process.h> /* _beginthread, _endthread */

#include <string.h>

#include <time.h>

CFile f;

CFileException ex;

clock_t start, finish,finish1;

// удалить сообщение с номером

void del(char* p,int n) {

char tel[200];

int j=0;

for (int i=n;p[i]!=' ';i++) {

tel[j]=p[i];

j++;

}

tel[j]='\0';

char fName[200];

fName[0]='\0';

strcat(fName,tel);

strcat(fName,".SMS");

DeleteFile((LPCSTR)fName);

cout<<"SMS is removed"<<endl;

}

// удалить все сообщения

void delall() {

CFileFind m_finder;

BOOL bWorking;

bWorking = m_finder.FindFile("\\*.SMS");

while (bWorking)

{

bWorking = m_finder.FindNextFile();

CString m_FileName = m_finder.GetFileName();

DeleteFile(m_FileName);

}

cout<<"All SMS were removed"<<endl;

}

//Отослать сообщение на SMS-центр для номера

void sms(char* p,int n) {

char tel[200];

char str[200]; int j=0;

for (int i=n;p[i]!=' ';i++) {

tel[j]=p[i];

j++;

}

tel[j]='\0';

n=i+1;j=0;

for(i=n;p[i];i++) {

str[j]=p[i];

j++;

}

str[j]='\0';

char fName[200];

fName[0]='\0';

strcat(fName,tel);

strcat(fName,".SMS");

cout<<"sms processing...";

if (!f.Open(fName,CFile::modeWrite | CFile::modeCreate,&ex)) {

cerr<<"SMS storage error. Try again\n";

exit(EXIT_FAILURE);

}

f.Write(str,strlen(str));

f.Close();

cout<<"sent successfully"<<endl;

}

void SMSworking(void* newS) {

int c;

char p[200], com[200];

com[0]='\0';p[0]='\0';

finish1=clock();

finish1-=CLOCKS_PER_SEC*60;

strcat(p,"SMS center connected...\n");

cout << p << endl;

send((SOCKET)newS,p,sizeof(p),0);

while((c=recv((SOCKET)newS,p,sizeof(p),0)!=0)) {

int i=0;

while (p[i]!=' ') {

com[i]=p[i];

i++;

};

com[i]='\0';i++;

if (!strcmp(com,"sms")) {

start = clock();

if((double)(start - finish1) / CLOCKS_PER_SEC < 60 )

cout<<"Cannot be sended - try again later"<<endl;

else

{

sms(p,i);

finish1=start;

}

com[0]='\0';

}

if (!strcmp(com,"del")) {

finish = clock();

// если с отправки сообщения прошло больше минуты

if((double)(finish - start) / CLOCKS_PER_SEC > 60 )

cout<<"Cannot be canceled"<<endl;

else

del(p,i);

com[0]='\0';

}

if (!strcmp(com,"delall")) {

delall();

com[0]='\0';

}

if (!strcmp(com,"quit")) {

closesocket((SOCKET)newS);

exit(EXIT_SUCCESS);

com[0]='\0';

}

}

}

int main() {

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD(2,2);

err = WSAStartup(wVersionRequested, &wsaData);

if(err != 0) return -1;

cout << "SMS-center started" << endl;

sockaddr_in local;

local.sin_family = AF_INET;

local.sin_port = htons(1280);

local.sin_addr.s_addr = htonl(INADDR_ANY);

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

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

int r=listen(s,5);

while(true) {

sockaddr_in remote;

int j = sizeof(remote);

SOCKET newS = accept(s, (struct sockaddr*) &remote, &j);

_beginthread(SMSworking,0,(void*)newS);

}

WSACleanup();

return 0;

}