小樱 发表于 2019/7/3 21:22

修改pt程序nexusphp代码支持compact=1参数返回二进制文件的 ipv6 peers列表用于支持客户端互相连接下载的方法,抓包tracker来修复代码

修改pt程序nexusphp代码支持compact=1参数返回二进制文件的 ipv6 peers列表用于支持客户端互相连接下载的方法,抓包tracker来修复代码

nexusphp默认是不支持ipv6的,会导致页面做种数量和客户端返回结果不一致。

问题所在
d8:intervali3600e12:min intervali30e8:completei67e10:incompletei0e5:peers354:q"…uZ…G…=5.J.(<.,T#’{x…e.jT.w.p.z%F7.y.zk…r.6.1W:.0T…qM.-…*.P.=…7…8…S…_.J…z.K

.S…vp… <…!..4…1D:…s…Su…=…ps.]A.y…qo\e…A…M.1.}MY…q…]…3…xi.r.H…1.n.v…]…e…Fo…]…3…0k…=3/…=.gVn.z…#'w!..-…9.WM.:7B…H .~U…

…uQ.=#&qQ.4…x.+.r.f…}u…p…eA.s…A…j…e

“peers”后面的354字节二进制数据都是ipv4 peer,每个ipv4 peer含4字节ip和2字节port共6字节,所以peer个数是354/6=59。ipv6 peers二进制数据按照协议是在“peers6”节点返回,从抓包看没有。

现在的pt程序,客户端收不到ipv6地址的,只能连接ipv4
这是修改过的,可以直接让客户端拿到ipv6
如果两边都是内网ipv4,那么,就会可能导致无法连接
如果连接成功,客户端才会互相汇报本地ipv6到对方客户端进行连接
直接服务器下发列表,客户端拿到了可以直接请求,不需要先ipv4建立


announce.php文件
114行搜索
$peer_list = "";
下方增加
$peer6_list = "";

130行搜索
$peer_list .= pack("Nn", sprintf("%d",$longip), $row['port']);

下方增加
                else
                {
                        $ipv6_packed = inet_pton($row['ip']);
                        if ($ipv6_packed)
                                $peer6_list .= $ipv6_packed . pack("n", $row['port']);
                }

147行搜索
$resp .= "l".$peer_list."e";
下方增加
if ($compact == 1 && strlen($peer6_list) > 0)
{
        $resp .= benc_str("peers6").benc_str($peer6_list);
}
出处:
https://github.com/wxhere/NexusPHP/commit/8827584baed639c6a1e7458af6bb778d4602d277

小樱 发表于 2019/7/3 22:49

公网bt tracker请求ipv6服务器,比如说
http://:2710/announce
返回
d8:completei2e10:downloadedi1e10:incompletei0e8:intervali1792e12:min intervali896e6:peers636:ô

可以得知
ipv4模式时,单用户6字节
ipv4与ipv6模式时,单用户18字节

页: [1]
查看完整版本: 修改pt程序nexusphp代码支持compact=1参数返回二进制文件的 ipv6 peers列表用于支持客户端互相连接下载的方法,抓包tracker来修复代码