Русское сообщество по скриптингу

[Модуль Socket] Пример работы

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[Модуль Socket] Пример работы

Сообщение RevCrew » 08 дек 2016, 20:38

Автор: RevCrew.
Сайт: 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) // закрываем соединение
}
 
Последний раз редактировалось RevCrew 14 дек 2016, 01:57, всего редактировалось 2 раз(а).
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: [Модуль Socket] Пример работы

Сообщение Fedcomp » 09 дек 2016, 01:29

Стоит сказать что
Код: Выделить всё
"GET %s HTTP/1.1^nHost:%s^r^n^r^n" 

Это http запрос, а также многие вебсервера шлют на три буквы если не указать заголовок User-Agent.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: [Модуль Socket] Пример работы

Сообщение RevCrew » 13 дек 2016, 21:21

Fedcomp, про то что шлют - это уже по обстоятельствам, если что можно и приписать
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: [Модуль Socket] Пример работы

Сообщение Fedcomp » 14 дек 2016, 00:08

50% веб серверов шлют. Новичку очень легко на это напороться и я бы добавил его в статью.
Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.


"я ставлю зависимости потому что мне приятно" - subb98 @ 2017
Аватара пользователя
Fedcomp
Администратор
 
Сообщения: 4936
Зарегистрирован: 28 авг 2009, 20:47
Благодарил (а): 813 раз.
Поблагодарили: 1317 раз.
Языки программирования: =>
pawn / php / python / ruby
javascript / rust

Re: [Модуль Socket] Пример работы

Сообщение RevCrew » 14 дек 2016, 01:57

Fedcomp, добавил
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: [Модуль Socket] Пример работы

Сообщение Kristina1 » 06 май 2019, 19:44

Он нужен в плагине для того чтобы проверять наличие обновлений и подгружать их?
если в коде прописан путь, который уже не действительный плагин будет работать ?
можно его как- то убрать из этого плагина?
Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
Kristina1
 
Сообщения: 10
Зарегистрирован: 06 май 2019, 18:19
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: JS,DELPHI


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11