我似乎无法模糊地从Python(我更喜欢使用)和PHP(其工作正常,由网站主机编码)脚本获得相同的数据。
PHP连接到与Python脚本相同的位置。
在任何人跳枪之前,我知道python脚本只检索部分数据。但我无法模糊地从服务器获得相同的数据。
的Python:
import socket, struct
host,port = 'baystation12.net', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send('status\r\n')
data = s.recv(1024)
s.close()
print 'Received:', repr(data) # >>> Received: '\x00\xc7\x00\x07\x02\xadj\x00\x00\x1c\xf6'
cache,form,listy = "",">H",[]
for i in data:
if cache != "":
listy.append(struct.unpack(form,cache+i))
else:
cache = i
print "Unpacked:",listy # >>> Unpacked: [(199,), (0,), (7,), (2,), (173,), (106,), (0,), (0,), (28,), (246,)]
text = ""
for i in listy:
text += chr(i[0])
print "Text:",text # >>> Text: Ç
#Shows up incorrectly when I try to copy it.
PHP:
#!/usr/bin/php
<?php
function export($addr,$port,$str)
{
if($str{0} != "?") $str = ("?" . $str);
$query = "\x00\x83" . pack("n",strlen($str)+6) . "\x00\x00\x00\x00\x00" . $str . "\x00";
$server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or exit('Unable to create export socket; ' . socket_strerror(socket_last_error()));
socket_connect($server,$addr,$port) or exit('Unable to establish socket connection; ' . socket_strerror(socket_last_error()));
$bytessent = 0;
while($bytessent < strlen($query))
{
$result = socket_write($server,substr($query,$bytessent),strlen($query)-$bytessent);
if($result === FALSE) return('Unable to transfer requested data; ' . socket_strerror(socket_last_error()));
$bytessent += $result;
}
$resbuf = '';
while( socket_recv($server, $message,1,0 )){
$resbuf .= $message;
if(strpos($resbuf,"&end")!=FALSE)
{
echo $resbuf;
socket_close($server);
return($resbuf);
}
echo $message;
};
echo $resbuf."\n";
socket_close($server);
}
export("localhost","8000","status");
?>
PHP的输出:
version=Baystation+12&mode=extended&respawn=0&enter=1&vote=1&ai=1&host&players=5&player0=CompactNinja&player1=Sick+trigger&player2=SweetJealousy&player3=Cacophony&player4=Anchorshag&end
任何想法为什么Python在解包数据时会给出无意义的字符,而PHP则给出了上述内容。
答案 0 :(得分:2)
您没有在python中向服务器发送相同的查询。
在python中你发送status
在PHP中,您发送的内容类似于\x00\x83\x00\x0d\x00\x00\x00\x00\x00\x00?status\x00
如果你改变你的python以更接近地模仿PHP,那么它的效果会好很多:
import socket, struct
host,port = 'baystation12.net', 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
senddata = "?status"
query = '\x00\x83' + struct.pack(">H", len(senddata)+6) + '\x00'*5 + senddata + '\x00'
s.send(query)
data = s.recv(1024)
print `data`
当我尝试时,它打印
'\x00\x83\x00\xe9\x06version=Baystation+12&mode=traitor&respawn=0&enter=1&vote=1&ai=1&host&players=7&player0=Kosherman&player1=Ghazkull&player2=Doug+H.+Nuts&player3=Lord+Braindead&player4=KirbyElder&player5=Master+of+Apples&player6=Cacophony&end=%23end\x00'
这与PHP的内容非常相似。
答案 1 :(得分:0)
尝试listy.append(struct.unpack(form,cache+i)[0])
您最终得到的是1元素元组列表,而不是数字列表。
来自文档:http://docs.python.org/library/struct.html#struct.unpack
struct.unpack(fmt, string)
打开绳子包装(大概是打包的 pack(fmt,...))根据给定的格式。 结果是一个元组 即使它只包含一个项目。字符串必须完全包含 格式所需的数据量(len(字符串)必须相等 calcsize(FMT))。