请教一个用winsock连cs服务器的问题200分(200分)

  • 主题发起人 主题发起人 爱与和平
  • 开始时间 开始时间
截到了
no1 icmp 56
45 00 00 38 16 fb 00 00 80 01 fa 31 ca ca ca 01 ca ca ca 01 03 03 db ed 00 00 00 00 45 00 00 27

16 fa 00 00 80 11 fa 33 ca ca ca 01 ca ca ca 01 e2 a7 69 88 00 13 d4 cb
-----------------------------------------
no2
45 00 00 38 16 fd 00 00 80 01 fa 2f ca ca ca 01 ca ca ca 01 03 03 db ed 00 00 00 00 45 00 00 27

16 fc 00 00 80 11 fa 31 ca ca ca 01 ca ca ca 01 e2 a8 69 89 00 13 d4 c9
------------------------------------------------------------
no3
45 00 00 38 16 ff 00 00 80 01 fa 2d ca ca ca 01 ca ca ca 01 03 03 db ed 00 00 00 00 45 00 00 27

16 fe 00 00 80 11 fa 2f ca ca ca 01 ca ca ca 01 e2 a9 69 8a 00 13 d4 c7
都是icmp包,56个字节,每次过来三个,是不是我说的'details','players','rules'??
可是我右截了几次,和前面截到的不一样,只有固定的和后几个字节是一样的,
我对这些不怎么了解的,希望高人能援手
 
盯不住了,今天暂时打住,希望高手能解决问题,灌水和参观的能提前
谢谢
 
请大家继续讨论,
 
我在网上找到了一些资料,但是是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ä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ä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ämlich spä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önnen wir den String abfragen
//做一个循环,一个字节一个字节的读,直到读完???s:=s+read???
do
{
$server_data .= fread($hlserver_con, 1); // 1 Byte vom Server holen und dem String anhängen
$status = socket_get_status($hlserver_con);
}
while($status["unread_bytes"] != 0);

// Verbindung schließ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:Port
$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äre es 'valve')
$hlserver["description"] = $serverdata[15]; // Mod-Name (hier wä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önnen wir die Infos ausgeben, die wir benö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设的很大它也能接收到乱七八糟的数据.
请教高人,我该怎么做???
 
返回的数据结构应该是这样的
(int32) -1
(string) Verschiedene Server-Infos (die einzelnen Werte in dem String sind
durch das Zeichen "/" getrennt)
德文,看不懂,晕丫
 
我是搞网络游戏的
其实每条消息的前面肯定有个文件头
否则服务器就没有办法做出对应的处理了
比如cstAlogin,username,password
服务器先解析文件头如果是登陆要求就进行验证!
cstAmove,x,y就是通知服务器你移动到了那里!
 
不不,你理解错了我的意思,我不是想登录服务器,我只是想得到服务器的状态
我已经有sdk了,我正在看
 
后退
顶部