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

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

sockaddr_in addr;

char b[200];

int err, size;

SetConsoleCP(1251); // локализация ввода

SetConsoleOutputCP(1251); // локализация вывода

wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

if (err != 0) return; // если ошибка - завершение работы

s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета, протокол UDP

addr.sin_family = AF_INET; // тип адреса

addr.sin_port = htons(1024); // номер порта

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

cout << "Введите строку" << endl;

cin.getline(b, sizeof(b), '\n'); // ввод строки

size = sizeof(addr);

sendto(s, b, sizeof(b), 0, (sockaddr*) &addr, size); // отправка строки серверу

if (recvfrom(s, b, sizeof(b), 0, (sockaddr*) &addr, &size) != 0) // получение ответа

{

cout << b << endl; // вывод результата

closesocket(s); // закрытие сокета

}

WSACleanup(); // завершение работы с WinSock API

}

Серверная часть программы:

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

#include <process.h> // работа с потоками

using namespace std;

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

#include <process.h> // работа с потоками

using namespace std;

int thread_cnt = 0; // счётчик потоков

void thread_func(void *s) // рабочая функция потока

{

sockaddr_in addr;

int size, i, j, k, e, n;

char ch, b1[200], b2[200];

addr.sin_family = AF_INET; // тип адреса

addr.sin_port = htons(1024); // номер порта

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера

size = sizeof(addr);

bind((SOCKET)s, (sockaddr*) &addr, size); // связывание сокета с локальным адресом

if (recvfrom((SOCKET)s, b1, sizeof(b1), 0, (sockaddr*) &addr, &size) != 0) // если приняты данные {

e = n = strlen(b1); // длина принятой строки

b2[e--] = '\0'; // граница новой строки

for (i = j = 0; i <= n; i++) // перебор всех символов в строке

{

if ((b1[i] == ' ') || (b1[i] == '\0') ) // найден разделитель между словами

{

for (k = (i - 1); k >= j; k--) b2[e--] = b1[k]; // копирование слова

if (b1[i] == ' ') b2[e--] = ' '; // копируем разделитель слов

j = i + 1; // начало следующего слова

}

}

sendto((SOCKET)s, b2, sizeof(b2), 0, (sockaddr*) &addr, size); // отправка результата

}

thread_cnt--; // уменьшаем счётчик потоков

}

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

int err;

wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии

err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL

if (err != 0) return; // если ошибка - завершение работы

s = socket(AF_INET, SOCK_DGRAM, 0); // создание сокета, протокол UDP

while(true) // вечный цикл обработки

{

if (thread_cnt < 10) // ограничение на число потоков

{

thread_cnt++; // увеличиваем счётчик потоков

_beginthread(thread_func, 0, (void*)s); // запуск нового потока

}

}

WSACleanup(); // прекращение работы с WinSock DLL

}

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

Лабораторная работа №8

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

Краткое описание алгоритма: программа-клиент при запуске инициализирует библиотеку WinSock, создаёт сокет и подключается к удалённому серверу по протоколу TCP. Далее клиент получает от сервера строку-приветствие от SMS-центра и выводит её на экран. Затем выполняется ввод текущей команды и её отправка SMS-центру. Цикл ввода и отправки выполняется до тех пор, пока не будет введена команда выхода, после чего клиент завершает свою работу.

Программа-сервер инициализирует библиотеку WinSock, создаёт сокет и ожидает подключения клиента. После подключения для нового клиента создаётся новый поток, в котором осуществляется функционирование SMS-центра. В процессе работы сервер принимает команды от клиента, и в зависимости от команды выполняются следующие действия: вывод правил пользования услугой, отправка сообщения или удаление сообщения с заданным номером. При этом действуют временные ограничения – частота отправки не более сообщения в 20 секунд для одного клиента, удаление сообщения возможно если прошло не более минуты с времени его отправления. При получении команды выхода SMS-центр завершает свою работу.

Клиентская часть программы:

#include <iostream> // потоки ввода-вывода

#include <winsock2.h> // работа с сокетами

using namespace std;

Соседние файлы в папке КР по КС Вариант №7