байткод socket

Banana

Участник
Сообщения
892
Реакции
113
Здравствуйте.

Необходимо отправить по средствам SM Socket такую структуру данных

\xFF\xFF\xFF\xFF\x54Source Engine Query\x00\xD3\x91\x81\x71

где - \xD3\x91\x81\x71 описаны в переменной и данные могут быть другими в процессе работы:
szReceiveData[5] = \xD3;
szReceiveData[6] = \x91;
szReceiveData[7] = \x81;
szReceiveData[8] = \x71;

C++:
public int OnSocketReceive(Handle hSocket, const char[] szReceiveData, const int iDataSize, any arg)
{
    if (iDataSize == 9)
    {
        decl String:requestStr[ 64 ];
        Format( requestStr, sizeof( requestStr ), "%s", "\xFF\xFF\xFF\xFF\x54Source Engine Query");
      
        НУЖНО ЧТО-ТО ТИПО такого но средствами языка SM что-бы отправить нужный набор бит по сети:

        requestStr += \x00;
        requestStr += szReceiveData[5];
        requestStr += szReceiveData[6];
        requestStr += szReceiveData[7];
        requestStr += szReceiveData[8];

        SocketSend( hSocket, requestStr, 64 );
        return;
    }
}
Сообщения автоматически склеены:

Возможно дело в \x00 где String его понимает как терминальный ноль (окончание строки) и не передает символы после его на отправку в сокет
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
так вроде же было несколько плагинов , которые с другими серверами так общались
я даже себе один делал для перехода между своими серверами
 

Banana

Участник
Сообщения
892
Реакции
113
так вроде же было несколько плагинов , которые с другими серверами так общались
я даже себе один делал для перехода между своими серверами
мне просто нужно исправить - Server queries - Valve Developer Community

Challenge Mechanism​


для плагина - Server List - socket версия. Стимворкс версию не хочу юзать т.к там пиратские игроки не показываются.

для игры CSS сервера стали отправлять "испытательные" 4 байта прежде чем давать информацию о сервере клиенту(
 

who

Участник
Сообщения
34
Реакции
16
мне просто нужно исправить - Server queries - Valve Developer Community

Challenge Mechanism​


для плагина - Server List - socket версия. Стимворкс версию не хочу юзать т.к там пиратские игроки не показываются.

для игры CSS сервера стали отправлять "испытательные" 4 байта прежде чем давать информацию о сервере клиенту(
Можешь отсюда взять код
 

Banana

Участник
Сообщения
892
Реакции
113
C-подобный:
Format(buff, sizeof(buff), "\xFF\xFF\xFF\xFF\x54Source Engine QueryA%c%c%c%c", se.challenge & 0xFF, se.challenge >> 8 & 0xFF, se.challenge >> 16 & 0xFF, se.challenge >>> 24);
        // Server expectes zero terminated string, so hacking around the Format() function here
        buff[24] = '\0';
        SocketSend(socket, buff, 29);

сейчас буду пробовать вот нарыл где-то

PS. Это сработало =)
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
У меня в плагине было такое:
C-подобный:
void GetServerInfo()
{
    for(int i; i < iServersCount; i++)
    {
        sMap[i][0] = 0;
        bSocketError[i] = bGoodStatus[i] = false;
        hSocket[i] = SocketCreate(SOCKET_UDP, OnSocketError);
        SocketSetArg(hSocket[i], i);
        SocketConnect(hSocket[i], OnSocketConnected, OnSocketReceive, OnSocketDisconnected, sIP[i], StringToInt(sPort[i]));
    }

    CreateTimer(SERVER_TIMEOUT, Timer_CheckStatus, TIMER_FLAG_NO_MAPCHANGE);
}

public void OnSocketError(Handle socket, const int errorType, const int errorNum, any arg)
{
    LogError("Server %s(%s:%s) is down: socket error '%s'(%d). ErrorNum: %d", sListName[arg], sIP[arg], sPort[arg], sErrorName[errorType], errorType, errorNum);
    bSocketError[arg] = true;
    bGoodStatus[arg] = false;
    CloseHandle(socket);
}

public void OnSocketConnected(Handle sock, any i)
{
    SocketSend(sock, "\xFF\xFF\xFF\xFF\x54Source Engine Query", 25);
}

public void OnSocketReceive(Handle sock, char[] receiveData, const int dataSize, any i)
{
    char sName[64], gameDir[64], gameDesc[64];

    int offset = 6;    //    2
    sName = GetString(receiveData, dataSize, offset);
    offset += strlen(sName) + 1;

    sMap[i] = GetString(receiveData, dataSize, offset);
    offset += strlen(sMap[i]) + 1;
    TrimString(sMap[i]);
    bGoodStatus[i] = strlen(sMap[i]) > 4;

    gameDir = GetString(receiveData, dataSize, offset);
    offset += strlen(gameDir) + 1;

    gameDesc = GetString(receiveData, dataSize, offset);
    offset += strlen(gameDesc) + 1;
    offset += 2;

    iPlayers[i] = GetByte(receiveData, offset);
    offset++;

    iMaxPlayers[i] = GetByte(receiveData, offset);

    CloseHandle(sock);
}

int GetByte(char[] receiveData, int offset)
{
    return receiveData[offset];
}

char GetString(char[] receiveData, int dataSize, int offset)
{
    static char serverStr[64];
    for(int i = offset, j; i < dataSize; i++)
    {
        serverStr[j] = receiveData[i];
        j++;
        if(!receiveData[i]) break;
    }
    return serverStr;
}

public void OnSocketDisconnected(Handle sock, any i)
{
    CloseHandle(sock);
}
 
Последнее редактирование:

Banana

Участник
Сообщения
892
Реакции
113
Получилось) Спасибо вам за помощь =)
Сообщения автоматически склеены:

Вопрос на засыпку

C-подобный:
Handle socket = SocketCreate(SOCKET_UDP, OnSocketError); SocketSetArg(socket, j);
        SocketSetOption(socket, SocketSendTimeout, 3);
        SocketSetOption(socket, SocketReceiveTimeout, 3);
        SocketConnect(socket, OnSocketConnected, OnSocketReceive, OnSocketDisconnected, ip, port);

делаю так, что если после успешного срабатывания OnSocketConnected (подключения) и отправки запроса на сервер, сервер не ответит? сокет так и будет открытым висеть? пахнет утечкой памяти если сервер не ответит и в OnSocketReceive мы не сделаем hSocket.Close();
 
Последнее редактирование:
Сверху Снизу