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); // выход из программы
}
}
}