我在网上找到了一些资料,但是是php+德文注释的,我晕,这个两个我都不懂
希望有大侠能把这个php转成delphi的.我用的udp控件是indy的tidudpclient,很奇怪,这个没有什么事件好判断接收是否结束.
以下是php原程序,中文注释是我猜的.
<?php
/* === serverinfo.php ================================================= */
$server_ip = "192.168.0.1"; // Hier deine IP einsetzen//ip地址
$server_port = 27015; // Port//端口
$hlserver_con = fsockopen("udp://".$server_ip, $server_port); // UDP Verbindung aufbauen//创建一个udp连接
// 4x 255 Bytes, String-Command und Zero-Byte schicken//发送的字符命令前4个字节是ffffffff,并以0结尾??
fwrite($hlserver_con, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, "infostring", 0x00));
fread($hlserver_con, 4); // den int32-Wert (4 Bytes) holen//从返回的数据读出4个字节???
// Würden wir jetzt den String vom Server holen, würde er in etwa so aussehen
// Achtung: an der Stelle wo ich das 'X' eingefügt habe, befindet sich normalerweise ein (unsichtbares)
// newline-Zeichen ("/n"). Das 'X' soll dies nur veranschaulichen. Dieses Zeichen
// belegt n&auml;mlich auch 1 Byte! Das spielt vor allem dann eine Rollen, wenn wir nachher die ersten
// 20 Bytes "abschneiden"! Ansonsten kommen in dem String keine newline-Zeichen vor.
// So s&auml;he der String also aus:
// infostringresponse/Xprotocol/45/address/192.168.0.4:27015/players/5/proxytarget/0
// /lan/1/max/16/gamedir/valve/description/Half-Life/hostname/Mein Half-Life Server/map/stalkyard
// /type/d/password/0/os/w
// wir wollen schon mal den Anfang holen (den brauchen wir n&auml;mlich sp&auml;ter nicht):
// infostringresponse/X <-- das X stellt hier wieder das newline-Zeichen dar
//晕丫,完全不懂,好像是讲返回的数据是以'/'来分割的.
fread($hlserver_con, 20);
// Verbindungsstatus abfragen
$status = socket_get_status($hlserver_con);
// Prüfen, ob die Verbindung fehlgeschlagen ist//如果数据结束了就报错???
if($status["unread_bytes"] == 0)
{
die("Verbindung fehlgeschlagen.");
}
$server_data = "";
// Gut, jetzt k&ouml;nnen wir den String abfragen
//做一个循环,一个字节一个字节的读,直到读完???s:=s+read???
do
{
$server_data .= fread($hlserver_con, 1); // 1 Byte vom Server holen und dem String anh&auml;ngen
$status = socket_get_status($hlserver_con);
}
while($status["unread_bytes"] != 0);
// Verbindung schlie&szlig;en
fclose($hlserver_con);
// Wir haben die Infos mit 'infostring' abgefragt, also müssen wir den String
// noch beim Zeichen "/" aufteilen (siehe oben).
// Hier muss statt "/", "//" geschrieben werden, damit es nicht
// als Escape-Zeichen erkannt wird.
//分离出用'/'分割开字符串??放到serverdata数组中??
$serverdata = explode("//", $server_data);
// die einzelnen Werte aus dem Array holen und in ein Array mit textuellen Indizies speichern
$hlserver["protocol"] = $serverdata[1]; // Protokoll Version
$hlserver["address"] = $serverdata[3]; // IP
ort
$hlserver["players"] = $serverdata[5]; // Spieleranzahl
$hlserver["proxytarget"] = $serverdata[7]; // HLTV Proxy?
// LAN-Server?
if($serverdata[9] == "1")
{
$hlserver["lan"] = "Ja";
}
else
{
$hlserver["lan"] = "Nein";
}
$hlserver["maxplayers"] = $serverdata[11]; // Maximale Spielerzahl
$hlserver["gamedir"] = $serverdata[13]; // Gamedir (hier w&auml;re es 'valve')
$hlserver["description"] = $serverdata[15]; // Mod-Name (hier w&auml;re es 'Half-Life'
$hlserver["hostname"] = $serverdata[17]; // Servername
$hlserver["map"] = $serverdata[19]; // Map
// Server-Typ (Dedicated/Listen)
if($serverdata[21] == "d")
{
$hlserver["type"] = "Dedicated";
}
else
{
$hlserver["type"] = "Listen";
}
// Password erforderlich?
if($serverdata[23] == "1")
{
$hlserver["password"] = "Ja";
}
else
{
$hlserver["password"] = "Nein";
}
// Server-Betriebssystem (Windows/Linux)
if($serverdata[25] == "w")
{
$hlserver["os"] = "Windows";
}
else
{
$hlserver["os"] = "Linux";
}
// Jetzt k&ouml;nnen wir die Infos ausgeben, die wir ben&ouml;tigen:
echo "Der ".$hlserver["type"]."-Server mit dem Namen '".$hlserver["hostname"];
echo "' hat die IP ".$hlserver["address"].".<br>/n";
echo "Es spielen gerade ".$hlserver["players"]." auf dem Server, maximal dürfen ";
echo "aber nur ".$hlserver["maxplayers"]." auf den Server.";
// ... würde folgendes ausgeben:
// Der Dedicated-Server mit dem Namen 'Mein Half-Life Server' hat die IP 192.168.0.1:27015.
// Es spielen gerade 5 auf dem Server, maximal dürfen aber nur 16 auf den Server.
?>
我用udp的ReceiveString方法根本就接收不到字符串,
估计是最前面的几个字节在捣鬼,这个php程序就是把最前面的几个字节给忽略了,
用delphi如何做到??
用ReceiveBuffer方法来接收,接收到的是一堆乱七八糟的数据,而且感觉想是一个无底洞,
把buff设的很大它也能接收到乱七八糟的数据.
请教高人,我该怎么做???