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

#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