首頁 >後端開發 >php教程 >还是关于PHP的二进制流有关问题

还是关于PHP的二进制流有关问题

WBOY
WBOY原創
2016-06-13 12:18:58905瀏覽

还是关于PHP的二进制流问题
之前发了一帖: http://bbs.csdn.net/topics/391024843
版主给了回答,也能够解析出来,但却发现出来的结果与真实结果完全不一样,比如服务器返回给我的是: ip: 107.145.107.140, port: 26773
但我解析出来却变成了: ip: 46.48.46.48, port: 63271
这样就差的远了, 我用PHP去获取nodes信息,然后将nodes信息自己解析输出一遍,顺便把未解析数据发送给pthon解析一遍,然后两边对比,发现结果却不一样

PHP(使用了swoole):

<?php<br />$serv = new swoole_server('0.0.0.0', 6882, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);<br />$serv->set(array(<br />    'worker_num' => WORKER_NUM,<br />    'daemonize' => false,<br />    'max_request' => MAX_REQUEST,<br />    'dispatch_mode' => 2,<br />    'debug_mode' => 1<br />));<br />$serv->on('Start', function($serv){<br />    echo "DHT Server start...\n";<br />    $nid = get_node_id();<br /><br />    $msg = array(<br />        't' => entropy(2),<br />        'y' => 'q',<br />        'q' => 'find_node',<br />        'a' => array(<br />            'id' => $nid,<br />            'target' => $nid<br />        )<br />    );<br /><br />    $serv->sendto(gethostbyname('router.bittorrent.com'), 6881, encode($msg));<br />});<br />$serv->on('Receive', function($serv, $fd, $from_id, $data){<br />    echo "New receive from ip: ";<br />    $msg = decode($data);<br />    $fdinfo = $serv->connection_info($fd);<br />    echo $fdinfo['remote_ip'] . "\n";<br /><br />    if($msg['y'] == 'r'){<br />        if(array_key_exists('nodes', $msg['r']))<br />            //$this->response_actions($msg, array($fdinfo['remote_ip'], $fdinfo['remote_port']));<br />            $nodes = decode_nodes($msg['r']['nodes']);<br />            foreach($nodes as $node){<br />                echo "nid: " . $node->nid . ", ip: " . $node->ip . ", port: " . $node->port . "\n";<br />            }<br />            $serv->sendto('127.0.0.1', 6813, $data);<br />    }<br />});<br /><br />function entropy($length=20){<br />        $s = '';<br /><br />        for($i=0;$i<$length;$i++)<br />            $s .= chr(mt_rand(0, 255));<br /><br />        return $s;<br />    }<br /><br />function get_node_id(){<br />        return sha1(entropy());<br />    }<br /><br />function get_neighbor($target, $nid){<br />        return substr($target, 0, 10) . substr($nid, 0, -10);<br />    }<br /><br />function encode($msg){<br />        return Bencode::encode($msg);<br />    }<br /><br />function decode($msg){<br />        return Bencode::decode($msg);<br />    }<br /><br />function decode_nodes($msg){<br />        $n = array();<br />        $length = strlen($msg);<br /><br />        // 由于每个node都为26位, 若总长度不等于26的倍数则直接返回<br />        if(($length % 26) != 0)<br />            return $n;<br /><br />        $i = 0;<br /><br />        while($i<$length){<br />            //$s = substr($msg, $i, 26);<br />            //$d = unpack('a20nid/Lip/Sport', $s);<br />            //var_dump($d);<br />            //$d = unpack('a20nid/lip/sport', $s);<br />            //var_dump($d);<br />            //$n[] = new Node($d['nid'], long2ip($d['ip']), $d['port']);<br />            $nid = substr($msg, $i, 20);<br />            var_dump($nid);<br />            $ip = substr($msg, $i+20, 4);<br />            var_dump($ip);<br />            $ip = long2ip(unpack('L', $ip)[1]);<br />            $port = substr($msg, $i+24, 2);<br />            var_dump($port);<br />            $port = unpack('s', $port)[1];<br />            var_dump($port);<br />            //$n[] = new Node($nid, $ip, $port);<br /><br />            $i += 26;<br />        }<br /><br />        return $n;<br />    }<br /><br />$serv->start();


python:
#!/usr/bin/env python<br />#encoding: utf-8<br /><br />import socket<br />from hashlib import sha1<br />from random import randint<br />from struct import unpack<br />from socket import inet_ntoa<br />from threading import Timer, Thread<br />from time import sleep<br />from collections import deque<br />from bencode import bencode, bdecode<br /><br />def decode_nodes(nodes):<br />    n = []<br />    length = len(nodes)<br />    if(length % 26) != 0:<br />        return n<br /><br />    for i in range(0, length, 26):<br />        nid = nodes[i:i+20]<br />        ip = inet_ntoa(nodes[i+20:i+24])<br />        ip2 = nodes[i+20:i+24]<br />        print ip2<br />        port = unpack("!H", nodes[i+24:i+26])[0]<br />        port2 = nodes[i+24:i+26]<br />        print port2<br />        print "decode_nodes: nid: %s, ip: %s, port: %s\n" % (nid, ip, port)<br /><br />class DHTServer():<br />    def __init__(self):<br />        self.ufd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)<br />        self.ufd.bind(("0.0.0.0", 6813))<br /><br />    def process_find_node_response(self, msg, address):<br />        nodes = decode_nodes(msg["r"]["nodes"])<br /><br />        for node in nodes:<br />            (nid, ip, port) = node<br /><br />            print "find_node: nid: %s, ip: %s, port: %s\n" % (nid, ip, port)<br /><br />    def run(self):<br />        while True:<br />            try:<br />                (data, address) = self.ufd.recvfrom(65536)<br />                msg = bdecode(data)<br />                self.on_message(msg, address)<br />            except Exception:<br />                pass<br /><br />    def on_message(self, msg, address):<br />        try:<br />            if msg["y"] == "r":<br />                if msg["r"].has_key("nodes"):<br />                    self.process_find_node_response(msg, address)<br />        except KeyError:<br />            pass<br /><br />if __name__ == "__main__":<br />    # max_node_qsize bigger, bandwith bigger, spped higher<br />    dht = DHTServer()<br />    dht.run()

------解决思路----------------------
$s = 'P9LI9UagRY0oDfVScSnuyKZHmjRO68KLdlc/0sj1RqBFjSgN9VJxKe7IpkeaNE7rwot2Vz/SyPVGoEWNKA31UnEp7simR5o0TuvCi3ZXP/wj7jU8hMYdclU8RKIZNM7tvZSxt+rIH5A//CPuNTyExh1yVTxEohk0zu29lLG36sgfkD/8I+41PITGHXJVPESiGTTO7b2UsbfqyB+QP/9M6KfuKOE8aeW+E0SS7Ug7UHZlzEY+GuE//0zop+4o4Txp5b4TRJLtSDtQdmXMRj4a4T//TOin7ijhPGnlvhNEku1IO1B2ZcxGPhrhPk6NAzs25ZjxFKrQJrZEjbfkAhg8GYaAGuE+To0DOzblmPEUqtAmtkSNt+QCGDwZhoAa4T5OjQM7NuWY8RSq0Ca2RI235AIYPBmGgBrhPs9ltmz/1Jul2AA0wRDx0d4e2AFR4CzD2+A+z2W2bP/Um6XYADTBEPHR3h7YAVHgLMPb4D7PZbZs/9SbpdgANMEQ8dHeHtgBUeAsw9vgPajAE2YlZG+/uqPNCgQzuP6WjQ7fpv0NGuE=';<br />$s = base64_decode($s);<br />foreach(str_split($s, 26) as $s) {<br />  $r = unpack('a20n/Nip/np', $s);<br />  $r['ip'] = long2ip($r['ip']);<br />  print_r($r);<br />}
Array<br />(<br />    [n] => ????F E?(<br />?Rq)???G?4<br />    [ip] => 78.235.194.139<br />    [p] => 30295<br />)<br />Array<br />(<br />    [n] => ????F E?(<br />?Rq)???G?4<br />    [ip] => 78.235.194.139<br />    [p] => 30295<br />)<br />Array<br />(<br />    [n] => ????F E?(<br />?Rq)???G?4<br />    [ip] => 78.235.194.139<br />    [p] => 30295<br />)<br />Array<br />(<br />    [n] => ?ü#?5<??rU<D?4?í?”<br />    [ip] => 177.183.234.200<br />    [p] => 8080<br />)<br />Array<br />(<br />    [n] => ?ü#?5<??rU<D?4?í?”<br />    [ip] => 177.183.234.200<br />    [p] => 8080<br />)<br />Array<br />(<br />    [n] => ?ü#?5<??rU<D?4?í?”<br />    [ip] => 177.183.234.200<br />    [p] => 8080<br />)<br />Array<br />(<br />    [n] => ??Lè§?(á<i??D’íH;Pv<br />    [ip] => 101.204.70.62<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => ??Lè§?(á<i??D’íH;Pv<br />    [ip] => 101.204.70.62<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => ??Lè§?(á<i??D’íH;Pv<br />    [ip] => 101.204.70.62<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => >N?;6?????&?D?·?<br />    [ip] => 60.25.134.128<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => >N?;6?????&?D?·?<br />    [ip] => 60.25.134.128<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => >N?;6?????&?D?·?<br />    [ip] => 60.25.134.128<br />    [p] => 6881<br />)<br />Array<br />(<br />    [n] => >?e?l?????4?????<br />    [ip] => 81.224.44.195<br />    [p] => 56288<br />)<br />Array<br />(<br />    [n] => >?e?l?????4?????<br />    [ip] => 81.224.44.195<br />    [p] => 56288<br />)<br />Array<br />(<br />    [n] => >?e?l?????4?????<br />    [ip] => 81.224.44.195<br />    [p] => 56288<br />)<br />Array<br />(<br />    [n] => =¨?f%do????<br />3??–?<br />    [ip] => 223.166.253.13<br />    [p] => 6881<br />)<br />
应该是没有问题的

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn