Добавил:
inrad
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:КР по КС Вариант №7 / lab8 / lab8_server / lab8_server
.cpp
#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); // выход из программы
}
}
}
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
SOCKET s1, s2;
sockaddr_in addr1, addr2;
int err, size;
SetConsoleOutputCP(1251); // локализация вывода
wVersionRequested = MAKEWORD(2, 2); // максимальный номер версии
err = WSAStartup(wVersionRequested, &wsaData); // инициализация WinSock DLL
if (err != 0) return; // если ошибка - завершение работы
addr1.sin_family = AF_INET; // тип адреса
addr1.sin_port = htons(1280); // номер порта
addr1.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP-адрес сервера
s1 = socket(AF_INET, SOCK_STREAM, 0); // создание сокета, протокол TCP
bind(s1, (sockaddr*) &addr1, sizeof(addr1)); // связывание сокета с локальным адресом
listen(s1, 5); // перевод сокета в состояние прослушивания
while (true) // вечный цикл обработки
{
size = sizeof(addr2);
s2 = accept(s1, (sockaddr*)&addr2, &size); // ожидание соединения с клиентом
_beginthread(work_sms, 0, (void*)s2); // запуск нового потока
}
WSACleanup(); // прекращение работы с WinSock DLL
}
Соседние файлы в папке lab8_server