Сайт: amx-x.ru
Модуль Sockets (amxx):
- Нужен для обмена\отправки\получения данных.
- Имеет 2 типа соединения TCP и UDP (Прочитать можно Вы должны зарегистрироваться, чтобы видеть ссылки.)
В данной статье будет рассмотрен следующий просто пример:
Получение данных с веб-сайта(а именно актуальной версии плагина) и сравнение ее с текущей.
Дальше будут написаны функции которыми будем пользоваться.
Функции:
- socket_open - открытие соединения
- socket_send - посылка запроса
- socket_change - проверка, изменился ли сокет
- socket_recv - получение данных
- socket_close - закрытие соединения
Итак, для работы нам нужен будет вебсайт. Для примера возьмем
Далее, на этом веб-сайте создаем файл с именем update.html. У него будет следующий путь:
Со следующим содержимым
- Код: Выделить всё
version 1.1|
Почему именно такое содержание? version - ключевое слово по которому мы найдем нашу актуальную версию. Число 1.1 это и есть наша актуальная версия. Знак | нужен чтобы все было хорошо .
Начинаем писать плагин.
Подключаем инклуды
- Код: Выделить всё
#include <amxmodx>
#include <sockets>
Объявляем переменные.
- Код: Выделить всё
new g_Socket2 //id сокета
new const HOST[] = "mysite.ru" // host
new const PAGE[] = "/update.html" // веб страница
- Код: Выделить всё
public CheckUpdates()
{
new error, sendbuffer[128]
g_Socket2 = socket_open(HOST, 80, SOCKET_TCP, error) // открываем соединение
// 80 означает что мы подключаемся к http порту
if(error > 0) // если ошибка, то завершаем работу
// ошибки вы можете посмотреть в описании функции socket_open
set_fail_state("Unable to create socket...");
// создаем массив с данными для отправки
// создаем запрос типа GET
new len = format(sendbuffer, sizeof(sendbuffer) - 1, "GET %s HTTP/1.1^x0d^nUser-Agent: ThisPlugin^x0d^nHost:%s^r^n^r^n", PAGE, HOST)
// отправляем запрос
socket_send(g_Socket2, sendbuffer, len)
// Создаем таск на получение ответа
set_task(10.0, "TaskCheckUpdates")
}
- Код: Выделить всё
public TaskCheckUpdates()
{
// Если наш сокет изменился, в нем появились новые данные
if (socket_change(g_Socket2))
{
// Массив для получения данных
new g_DataBuffer[1024]
// Получение данных
socket_recv(g_Socket2, g_DataBuffer, charsmax(g_DataBuffer))
// Переменная куда мы запишем нашу версию с веб-сайта
new g_StringVersion[22]
// Находим ключевое слово
new Position = containi(g_DataBuffer, "version");
// Если нашли...
if(Position >= 0)
{
// Перескакиваем это слово
// Сейчас у нас должно остаться следующее 1.1|
Position += strlen("version ");
// переменная для записи версии
new length
// Наша получаемая версия будет длины не больше 10
for (new i=0;i<10;i++)
{
//Записываем очередной символ
g_StringVersion[length] = g_DataBuffer[Position + i]
// Если дошли до | то прекращаем цикл. Мы уже получили то что нам надо
if(equali(g_StringVersion[length],"|"))
{
// Объявляем конец строки
g_StringVersion[length] = '^0';
break;
}
length++
}
// убираем пробелы
trim(g_StringVersion);
// Если наша версия не совпала с оригинальной то пишем
if(!equali(g_StringVersion,VERSION))
log_amx("[http://mysite.ru/update.html] Found version '%s'", g_StringVersion)
}
}
socket_close(g_Socket2) // закрываем соединение
}
Полноценный плагин:
- Код: Выделить всё
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <sockets>
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "RevCrew"
new g_Socket2
new const HOST[] = "mysite.ru"
new const PAGE[] = "/update.html"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
// Add your code here...
CheckUpdates()
}
public CheckUpdates()
{
new error, sendbuffer[128]
g_Socket2 = socket_open(HOST, 80, SOCKET_TCP, error) // открываем соединение
// 80 означает что мы подключаемся к http порту
if(error > 0) // если ошибка, то завершаем работу
// ошибки вы можете посмотреть в описании функции socket_open
set_fail_state("Unable to create socket...");
// создаем массив с данными для отправки
// создаем запрос типа GET
new len = format(sendbuffer, sizeof(sendbuffer) - 1, "GET %s HTTP/1.1^x0d^nUser-Agent: ThisPlugin^x0d^nHost:%s^r^n^r^n", PAGE, HOST)
// отправляем запрос
socket_send(g_Socket2, sendbuffer, len)
// Создаем таск на получение ответа
set_task(10.0, "TaskCheckUpdates")
}
public TaskCheckUpdates()
{
// Если наш сокет изменился, в нем появились новые данные
if (socket_change(g_Socket2))
{
// Массив для получения данных
new g_DataBuffer[1024]
// Получение данных
socket_recv(g_Socket2, g_DataBuffer, charsmax(g_DataBuffer))
// Переменная куда мы запишем нашу версию с веб-сайта
new g_StringVersion[22]
// Находим ключевое слово
new Position = containi(g_DataBuffer, "version");
// Если нашли...
if(Position >= 0)
{
// Перескакиваем это слово
// Сейчас у нас должно остаться следующее 1.1|
Position += strlen("version ");
// переменная для записи версии
new length
// Наша получаемая версия будет длины не больше 10
for (new i=0;i<10;i++)
{
//Записывам очередной символ
g_StringVersion[length] = g_DataBuffer[Position + i]
// Если дошли до | то прекращаем цикл. Мы уже получили то что нам надо
if(equali(g_StringVersion[length],"|"))
{
// Объявляем конец строки
g_StringVersion[length] = '^0';
break;
}
length++
}
// убираем пробелы
trim(g_StringVersion);
// Если наша версия не совпала с оригинальной то пишем
if(!equali(g_StringVersion,VERSION))
log_amx("[http://mysite.ru/update.html] Found version '%s'", g_StringVersion)
}
}
socket_close(g_Socket2) // закрываем соединение
}