• NoNameUltima (08.01.18 11:01) [0]
    PHP:
    $server['ip']     = '217.182.6.114';
    $server['port']   = 2303;
    $socket = @fsockopen("udp://{$server['ip']}", $server['port'], $errno, $errstr, 1);
    stream_set_timeout($socket, 1);
    stream_set_blocking($socket, TRUE);
    fwrite($socket, "\xFF\xFF\xFF\xFF\x55\xFF\xFF\xFF\xFF");
    $packet   = fread($socket, 4096);
    $challenge_code = substr($packet, 5, 4);
    fwrite($socket, "\xFF\xFF\xFF\xFF\x55{$challenge_code}");
    $packet   = fread($socket, 4096);
    @fclose($socket);
    function getString(&$packet)
    {
     $str = "";
     $n  = strlen($packet);
     for($i = 0;($packet[$i] != chr(0)) && ($i < $n); ++$i)
      $str .= $packet[$i];
     $packet = substr($packet, strlen($str));
     return trim($str);
    }
    while(strlen($packet) > 0)
    {
     $player['name'] = getString($packet);
     $packet   = substr($packet, 1);
     $lo    = (ord($packet[1]) << 8) | ord($packet[0]);
     $hi    = (ord($packet[2]) << 8) | ord($packet[3]);
     $player['kills']= ($hi << 16) | $lo;
     $packet   = substr($packet, 4);
     $f    = @unpack("f1float", $packet);
     $packet   = substr($packet, 5);
     $player['time'] = gmdate("H:i:s", (int)$f['float']);
     $array[]  = $player;  
     echo 'NAME: '.$player['name'].' KILLS: '.$player['kills'].' TIME: '.$player['time'].'<br/><br/>';
    }
    Delphi

    Var
    idUPD_Server_Info: TIdUDPServer;

    procedure TForm_Main.FormCreate(Sender: TObject);
    begin
     idUPD_Player_Info     := TIdUDPServer.Create(nil);
     idUPD_Player_Info.ReceiveTimeout := 3000;
     idUPD_Player_Info.OnUDPRead   := idUPD_Player_Info_Read;
    end;

    procedure TForm_Main.idUPD_Player_Info_Read(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
    Var
    Str_Data : AnsiString;
    Begin
    Memo1.Clear;
    IF AData[5] = 44 Then
     Begin
      Str_Data := #$FF+#$FF+#$FF+#$FF+#$55+CHR(AData[5])+CHR(AData[6])+CHR(AData[7])+CHR(AData[8]);
      idUPD_Player_Info.Send('217.182.6.114', 2303, Str_Data);
     End
    Else
     Memo1.Lines.Add(bytesToString(AData));
    end;

    procedure TForm_Main.Button1Click(Sender: TObject);
    var
    Request: AnsiString;
    begin
    Request := #$FF+#$FF+#$FF+#$FF+#$55+#$FF+#$FF+#$FF+#$FF;
    idUPD_Player_Info.Send('217.182.6.114', 2303, Request);
    end;

    При первом запросе, сервер должен вернуть 4 байта которые надо подставить к последующему запросу, для получения списка игроков.
    На PHP все работает.
    На Delphi вроде все правильно?
    Но сервер постоянно возвращает одинаковый ответ, даже после подстановки байтов.

    Поставил вывод в PHP
    for ($i = 0; $i <= strLen($packet); $i++)
     {
      echo '$packet[i]:'.ord($packet[$i])."<br>"."<br>";
     };
    Вроде все тоже самое...
  • KilkennyCat © (08.01.18 17:17) [1]

    > сервер постоянно возвращает одинаковый ответ

    посмотреть через прокси (например, https://www.charlesproxy.com/) что отправляется и что получается на самом деле.
  • aka © (08.01.18 18:40) [2]

    > C php на Indy

    Попробуй вставить

    <?php
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Expires: " . date("r"));
    echo "<h1>", date("H:i:s"), "</h1>";
    ?>


    Может страница кешируется?
  • NoNameUltima (09.01.18 00:16) [3]
    Еще вопрос в туже степь:

    PHP
    <?php
    $steamid = '76561198072428132';

    function beguid($id)
    {
     $result = '';
     for ($i = 0; $i < 8; $i++)
      {
       $result .= chr(gmp_strval(gmp_and($id, 0xFF)));
       $id  = gmp_div($id, gmp_pow(2, 8));
      }

     return md5('BE' . $result);
    }
    $guid = beguid(gmp_abs($steamid));
    echo($guid);
    ?>


    Данный код получает GUID стима, по UID'у

    Вот два UID'а для примера:

    Вводимый UID:
    76561198011331626
    Получаем GUID:
    0dc75e3f9e1732e45e3f5dd174ece330

    Вводимый UID:
    76561198072428132
    Получаем GUID:
    e6a3ca25f1cf4e8e0d4f7aa128ba41bb

    Скрипт работает.
    Если влом запсукать, есть онлайн сервис:
    http://www.legiongaminghq.org/converter
    Он выдает тот же результат, что и скрипт.

    Delphi

    Function IDmd5(S: String): String;
    Begin
    Result := '';
    With TIdHashMessageDigest5.Create do
    Try
     Result := AnsiLowerCase(HashStringAsHex(s));
    Finally
     Free;
    End;
    End;

    Function UID_to_GUID(UID: String): String;
    Var
    UIDint64 : int64;
    I   : Integer;
    Begin
    Result  := '';
    UIDint64 := StrToInt64(UID);
    For I := 0 to 7 do
     Begin
      Result   := Result + CHR(UIDint64 AND $FF);
      UIDint64 := UIDint64 DIV 256;
      //UIDint64 := UIDint64 shr 8;
     end;
    result := IDmd5('BE' + Result);
    end;

    Для первого UID, выдает правильный GUID, для второго - не правильный.
    Мож я что то не правильно тут понаписал?))
  • NoNameUltima (09.01.18 17:33) [4]
    По [0] (первому) вопросу разобрался.
    Ларчик просто открывался...
    IndyTextEncoding(1251)
  • NoNameUltima (11.01.18 09:53) [5]
    вопросов нет. проблема была с кодировкой....
Есть новые Нет новых   [91044   +20][b:0.001][p:0.002]