Определение внешнего IP

 

Может, пригодится кому-то.

// Test ExtIP.mq5
#property copyright "(c)2020-2024 Edgar Akhmadeev"
#property link      "https://www.mql5.com/en/users/dali"



union bytes4 {
        uint    v;
        uchar   b[4];
};



void
OnStart() {
        bytes4 ip;
        Print("External IP: ", GetExtIP(ip));
}



string 
GetExtIP(bytes4& ip) {
        const string cookie = NULL;
        char post[] = { 0 };
        string headers; 
        uchar result[]; 
        
        ResetLastError(); 
        int rc = WebRequest("GET", "https://api.ipify.org", cookie, NULL, 5000, post, 0, result, headers); 
        if (rc == -1) {
                Print("Include URL to accepted WebRequest list");
                return NULL;
        }

        if (rc == 403) {
                Print("Web site returns code Forbidden");
                return NULL;
        }

        if (rc != 200) {
                Print("Web site returns error code ", rc);
                return NULL;
        }

        string out = CharArrayToString(result);
        
        ip.v = 0;
        
        if (!_SplitIP(out, ip))
                return NULL;
        
        return out;
}



bool
_SplitIP(string s, bytes4& ip) {
        string buf[];
        int cnt = StringSplit(s, '.', buf);
        if (cnt != 4)
                return false;
        
        for (int i = 0; i < 4; ++i) {
                int len = StringLen(buf[i]);
                if (len < 1 || len > 3)
                        return false;
        
                ip.b[i] = (uchar)StringToInteger(buf[i]);
        }
        
        return true;
}
 
Edgar Akhmadeev:

Может, пригодится кому-то.

в приличном обществе https://ru.wikipedia.org/wiki/STUN

WebRequest может идти очень странными путями

 
Edgar Akhmadeev:

Может, пригодится кому-то.

Спасибо!

Проверил, работает!


 
Maxim Kuznetsov #:

в приличном обществе https://ru.wikipedia.org/wiki/STUN

WebRequest может идти очень странными путями

Не претендую-с. Действую по пути минимального сопротивления, это не коммерческое применение. У меня код работает круглосуточно каждый час. Сбой раз в несколько месяцев. И то, возможно надо просто увеличить таймаут.