Нужно получить IP+PORT сервера CS:GO

» SemKrill 冷静

Участник
Сообщения
31
Реакции
6
Нужно получить айпи сервера на котором работает плагин и порт сервера , что бы оно выглядело примерно так - 123.45.67.89:2250
После этого нужно сделать строку в виде : steam://connect/123.45.67.89:2250
Надеюсь вы мне поможите , спасибо заранее 😘

SM на сервере - SourceMod 1.11.0.6915
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Нужно получить айпи сервера на котором работает плагин и порт сервера , что бы оно выглядело примерно так - 123.45.67.89:2250
После этого нужно сделать строку в виде : steam://connect/123.45.67.89:2250
Надеюсь вы мне поможите , спасибо заранее 😘

SM на сервере - SourceMod 1.11.0.6915
qwe:
public void OnPluginStart()
{
    char buffer[72];
    int uIP = FindConVar("hostip").IntValue;
    FormatEx(buffer, sizeof(buffer), "steam://connect/%u.%u.%u.%u:%u", uIP >>> 24 & 255, uIP >>> 16 & 255, uIP >>> 8 & 255, uIP & 255, FindConVar("hostport").IntValue);
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #3
@» SemKrill 冷静, достоверный IP никак не получить из коробки. Можно через SteamWorks.
C-подобный:
int iAddr[4];
if (!SteamWorks_GetPublicIP(iAddr))
{
    // Не удалось получить адрес, возможно он ещё недоступен.
    return;
}

int iPort = FindConVar("hostport").IntValue;
char szFullAddr[32];
FormatEx(szFullAddr, sizeof(szFullAddr), "%d.%d.%d.%d:%d", iAddr[0], iAddr[1], iAddr[2], iAddr[3], iPort);

@Ganter1234, адрес в hostaddr некоторые плагины привязочные подменяют, полагаться на него -- не самая лучшая идея. Плюс в случае с серверами в локалке (домашние сервы, как правило), там может запросто оказаться не внешний IP, а локальный (192.168.0.101).
 

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
@» SemKrill 冷静, достоверный IP никак не получить из коробки. Можно через SteamWorks.
C-подобный:
int iAddr[4];
if (!SteamWorks_GetPublicIP(iAddr))
{
    // Не удалось получить адрес, возможно он ещё недоступен.
    return;
}

int iPort = FindConVar("hostport").IntValue;
char szFullAddr[32];
FormatEx(szFullAddr, sizeof(szFullAddr), "%d.%d.%d.%d:%d", iAddr[0], iAddr[1], iAddr[2], iAddr[3], iPort);

@Ganter1234, адрес в hostaddr некоторые плагины привязочные подменяют, полагаться на него -- не самая лучшая идея. Плюс в случае с серверами в локалке (домашние сервы, как правило), там может запросто оказаться не внешний IP, а локальный (192.168.0.101).
Получение достоверного IP (без дополнительных расширений)
 
Последнее редактирование:

» SemKrill 冷静

Участник
Сообщения
31
Реакции
6
Спасибо , через steamwork получилось 😉
Я получил это всё так :

Soursepawn:
 char sPublicIP[64];
    int iPublicIP[4];
    if (SteamWorks_GetPublicIP(iPublicIP)) {
        Format(sPublicIP, sizeof(sPublicIP), "steam://connect/%d.%d.%d.%d:%d", iPublicIP[0], iPublicIP[1], iPublicIP[2], iPublicIP[3], GetConVarInt(FindConVar("hostport")));
    } else {
        LogError("Appears like we had an error on getting the Public IP address.");
    }
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
в случае с серверами в локалке (домашние сервы, как правило), там может запросто оказаться не внешний IP, а локальный (192.168.0.101).
так и есть: у меня сервер имеет доступ в инет, но айпишнег по этому квару выдаёт локальный
Можно через SteamWorks
Я уже 8 лет с помощью команды status получаю внешний адрес плагином (не знаю как в CS:GO, а в L4D2 так не получится его получить):
C-подобный:
        char Output[300];
        ServerCommandEx(Output, sizeof(Output), "status");

        char buffer[3][100];
        int strings = ExplodeString(Output, "\n", buffer, 3, 100);
        if(strings == 3)
        {
            Regex regex = CompileRegex("udp\\/ip\\s+\\:\\s+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):(\\d+)\\s.*public\\s.*\\s(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|)");
            int subCount = regex.Match(buffer[2]);
            if(subCount == 4)
            {
                regex.GetSubString(2, sCurrentPort, 8);
                regex.GetSubString(3, sCurrentIP, 16);
                if(strlen(sCurrentIP) == 0) regex.GetSubString(1, sCurrentIP, 16);
            }
            else LogError("Can't find address (subCount = %i)", subCount);

            delete regex;
        }
 
Сверху Снизу