-
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>"; }; Вроде все тоже самое...
-
> сервер постоянно возвращает одинаковый ответ
посмотреть через прокси (например, https://www.charlesproxy.com/) что отправляется и что получается на самом деле.
-
> C php на Indy
Попробуй вставить
<?php header("Cache-Control: no-store, no-cache, must-revalidate"); header("Expires: " . date("r")); echo "<h1>", date("H:i:s"), "</h1>"; ?>
Может страница кешируется?
-
Еще вопрос в туже степь: PHP<?php
$steamid = '76561198072428132';
function beguid($id)
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Он выдает тот же результат, что и скрипт. DelphiFunction 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, для второго - не правильный. Мож я что то не правильно тут понаписал?))
-
По [0] (первому) вопросу разобрался. Ларчик просто открывался... IndyTextEncoding(1251)
-
вопросов нет. проблема была с кодировкой....
|