1

我正在寻找创建一个私人种子跟踪器,但我遇到了一个问题。我在协议规范中发现,现在大多数客户端使用的紧凑响应以二进制 4 字节表示大端的 IP 地址,2 表示端口。我试图这样做,但不确定我应该输入什么格式的 IP

我尝试了以下

$IP = "12.34.56.78";
$port = "12345";

$binary = pack("Nn", $IP, $port);

但是当我尝试使用 unpack("Nn" $binary) 将其转换回来时,在此示例中,我只是返回了 IP 地址的第一部分,它将是“12”,我尝试使用我得到的 torrent 客户端尝试此操作“内部服务器错误”

我也尝试过 ip2long 并且当我反转我得到长 ip 但是当我不确定这是否是正确的格式或什么时,我只知道它正在寻找 6 位的 ip 和端口。

任何关于我哪里出错的建议将不胜感激

贵宾32

4

2 回答 2

2

尝试这个:

包装:

$ip = "12.34.56.78";
$port = 12345;

$packed = pack("Nn", ip2long($ip), $port);

开箱:

$unpacked = unpack("Nip/nport", $packed);

echo "IP was ".long2ip($unpacked["ip"])."\n";
echo "Port was ".$unpacked["port"]."\n";

输出:

IP was 12.34.56.78
Port was 12345
于 2012-05-07T16:54:00.573 回答
0

要转换为二进制,您首先需要将其从人类可读的点分十进制表示法转换为计算机可读的符号 -pack()不理解.字符串中的点。您可以将地址拆分为其组成部分,并将它们视为无符号字符 ( c):

<?php

  $IP = "12.34.56.78";
  $port = "12345";

  $octets = explode('.', $IP);

  $binary = pack('ccccn', $octets[0], $octets[1], $octets[2], $octets[3], $port);

要转换回来,它会稍微复杂一些。调用时需要使用中继器并命名组件unpack()

<?php

  $unpacked = unpack('c4octet/nport', $binary);

  $IP = $unpacked['octet1'].".".$unpacked['octet2'].".".$unpacked['octet3'].".".$unpacked['octet4'];
  $port = $unpacked['port'];
于 2012-05-07T16:52:40.773 回答