还是关于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<$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 />

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

「你的組織要求你更改PIN訊息」將顯示在登入畫面上。當在使用基於組織的帳戶設定的電腦上達到PIN過期限制時,就會發生這種情況,在該電腦上,他們可以控制個人設備。但是,如果您使用個人帳戶設定了Windows,則理想情況下不應顯示錯誤訊息。雖然情況並非總是如此。大多數遇到錯誤的使用者使用個人帳戶報告。為什麼我的組織要求我在Windows11上更改我的PIN?可能是您的帳戶與組織相關聯,您的主要方法應該是驗證這一點。聯絡網域管理員會有所幫助!此外,配置錯誤的本機原則設定或不正確的登錄項目也可能導致錯誤。即

Windows11將清新優雅的設計帶到了最前沿;現代介面可讓您個性化和更改最精細的細節,例如視窗邊框。在本指南中,我們將討論逐步說明,以協助您在Windows作業系統中建立反映您的風格的環境。如何更改視窗邊框設定?按+開啟“設定”應用程式。 WindowsI前往個人化,然後按一下顏色設定。顏色變更視窗邊框設定視窗11「寬度=」643「高度=」500「>找到在標題列和視窗邊框上顯示強調色選項,然後切換它旁邊的開關。若要在「開始」功能表和工作列上顯示主題色,請開啟「在開始」功能表和工作列上顯示主題

預設情況下,Windows11上的標題列顏色取決於您選擇的深色/淺色主題。但是,您可以將其變更為所需的任何顏色。在本指南中,我們將討論三種方法的逐步說明,以更改它並個性化您的桌面體驗,使其具有視覺吸引力。是否可以更改活動和非活動視窗的標題列顏色?是的,您可以使用「設定」套用變更活動視窗的標題列顏色,也可以使用登錄編輯程式變更非活動視窗的標題列顏色。若要了解這些步驟,請前往下一部分。如何在Windows11中變更標題列的顏色? 1.使用「設定」應用程式按+開啟設定視窗。 WindowsI前往“個人化”,然

您是否在Windows安裝程式頁面上看到「出現問題」以及「OOBELANGUAGE」語句? Windows的安裝有時會因此類錯誤而停止。 OOBE表示開箱即用的體驗。正如錯誤提示所表示的那樣,這是與OOBE語言選擇相關的問題。沒有什麼好擔心的,你可以透過OOBE螢幕本身的漂亮註冊表編輯來解決這個問題。快速修復–1.點選OOBE應用底部的「重試」按鈕。這將繼續進行該過程,而不會再打嗝。 2.使用電源按鈕強制關閉系統。系統重新啟動後,OOBE應繼續。 3.斷開系統與網際網路的連接。在脫機模式下完成OOBE的所

工作列縮圖可能很有趣,但它們也可能分散注意力或煩人。考慮到您將滑鼠懸停在該區域的頻率,您可能無意中關閉了重要視窗幾次。另一個缺點是它使用更多的系統資源,因此,如果您一直在尋找一種提高資源效率的方法,我們將向您展示如何停用它。不過,如果您的硬體規格可以處理它並且您喜歡預覽版,則可以啟用它。如何在Windows11中啟用工作列縮圖預覽? 1.使用「設定」應用程式點擊鍵並點選設定。 Windows按一下系統,然後選擇關於。點選高級系統設定。導航至“進階”選項卡,然後選擇“效能”下的“設定”。在「視覺效果」選

許多用戶在選擇智慧型手錶的時候都會選擇的華為的品牌,其中華為GT3pro和GT4都是非常熱門的選擇,不少用戶都很好奇華為GT3pro和GT4有什麼區別,下面就給大家介紹一下二者。華為GT3pro和GT4有什麼差別一、外觀GT4:46mm和41mm,材質是玻璃鏡板+不鏽鋼機身+高分纖維後殼。 GT3pro:46.6mm和42.9mm,材質是藍寶石玻璃鏡+鈦金屬機身/陶瓷機身+陶瓷後殼二、健康GT4:採用最新的華為Truseen5.5+演算法,結果會更加的精準。 GT3pro:多了ECG心電圖和血管及安

在Windows11上的顯示縮放方面,我們都有不同的偏好。有些人喜歡大圖標,有些人喜歡小圖標。但是,我們都同意擁有正確的縮放比例很重要。字體縮放不良或圖像過度縮放可能是工作時真正的生產力殺手,因此您需要知道如何自訂以充分利用系統功能。自訂縮放的優點:對於難以閱讀螢幕上的文字的人來說,這是一個有用的功能。它可以幫助您一次在螢幕上查看更多內容。您可以建立僅適用於某些監視器和應用程式的自訂擴充功能設定檔。可以幫助提高低階硬體的效能。它使您可以更好地控制螢幕上的內容。如何在Windows11

一、黑/白名單IP限制存取配置nginx配置黑白名單有好幾種方式,這裡只介紹常用的兩種方法。 1.第一種方法:allow、denydeny和allow指令屬於ngx_http_access_module,nginx預設載入此模組,所以可直接使用。這種方式,最簡單,最直接。設定類似防火牆iptable,使用方法:直接設定檔中新增:#白名單設置,allow後面為可存取IPlocation/{allow123.13.123.12;allow23.53.32.1/100;denyall;}#黑名單設置,
