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

Void main()

{

WORD wVersionRequested;

WSADATA wsaData;

SOCKET s;

sockaddr_in addr;

char b[200];

int err;

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

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

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

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

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

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

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

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

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

connect(s, (sockaddr*) &addr, sizeof(addr)); // соединение с удалённым сокетом

recv(s, b, sizeof(b), 0); // получение приветствия

cout << b; b[0] = '\0';

do // цикл приёма команд

{

cin.getline(b, sizeof(b), '\n'); // ввод команды пользователя

send(s, b, sizeof(b), 0); // отправка команды на сервер

}

while (strcmp(b, "quit") != 0); // выход из цикла по команде quit

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

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

}

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

#include <time.h> // работа с временем

#include <stdlib.h> // стандартные функции

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

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

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

using namespace std;

void del_sms(char* b, int l) // удаление сообщения с номером

{

int i, j = 0;

char num[200];

for (i = 4; b[i] != '\0'; i++)

num[j++] = b[i]; // копирование номера

num[j] = '\0';

DeleteFileA(num); // удаление файла с сообщением

cout << "SMS удалено" << endl;

}

void send_sms(char* b, int l) // отправка сообщения на SMS-центр для номера

{

FILE *file;

int i, j = 0, k = 0;;

char num[200], msg[200];

for (i = 4; b[i] != ' '; i++)

num[j++] = b[i]; // копирование номера

num[j] = '\0';

for (i = (j + 5); b[i] != '\0'; i++)

msg[k++] = b[i]; // копирование сообщения

msg[k] = '\0';

file = fopen(num, "w"); // создание файла

if (file == NULL) // если произошла ошибка

{

cout << "Ошибка при сохранении SMS" << endl;

exit(EXIT_FAILURE); // аварийный выход

}

fwrite(msg, k, 1, file); // запись сообщения в файл

fclose(file); // закрытие файла

cout << "Отправка SMS выполнена" << endl;

}

void work_sms(void* s)

{

int i, l, t;

char b[200], c[200];

clock_t time, finish_time, start_time = 0;

strcpy(b, "Соединение с SMS-центром установлено\r\n");

send((SOCKET)s, b, sizeof(b), 0); // отправка пригласительного сообщения

while((recv((SOCKET)s, b, sizeof(b), 0) != 0)) // пока не закрыто соединение

{

l = strlen(b); // длина команды

for (i = 0; i < l; i++)

{

if (b[i] == ' ') break; // выделение части команды до первого пробела

else c[i] = b[i];

}

c[i] = 0;

if (strcmp(c, "sms") == 0) // если команда отправки

{

if (i == l) // нет параметров - вывод правил

{

cout << "Правила пользования услугой:" << endl;

cout << "Частота отправки - не более сообщения в 20 секунд для одного клиента" << endl;

cout << "Можно удалить сообщение, если прошло не более минуты с времени его отправления" << endl;

}

else

{

time = clock(); // время отправки

t = (time - start_time) / CLOCKS_PER_SEC; // время с момента предыдущей отправки

if ((t > 20) || (start_time == 0)) // если прошло более 20 секунд или первая отправка

{

start_time = time; // сохранение времени отправки

send_sms(b, l); // отправка сообщения

}

else cout << "Превышена частота отправки SMS" << endl;

}

}

else if (strcmp(c, "del") == 0) // если команда удаления

{

finish_time = clock(); // время удаления

t = (finish_time - start_time) / CLOCKS_PER_SEC; // время с момента отправки

if (t < 60) del_sms(b, l); // если прошло менее минуты - удаление сообщения

else cout << "Сообщение не может быть удалено" << endl;

}

else if (strcmp(c, "quit") == 0) // если команда выхода

{

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

exit(EXIT_SUCCESS); // выход из программы

}

}

}

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