PHP速学教程(入门到精通)
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
还是关于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 $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 //$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();
#!/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></d>
php免费学习视频:立即学习
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!
已抢6768个
抢已抢91265个
抢已抢14359个
抢已抢50498个
抢已抢190043个
抢已抢86161个
抢