1

プライベートトレントトラッカーを作成しようとしていますが、問題が発生しました。プロトコル仕様で、ほとんどのクライアントが現在使用しているコンパクトな応答は、ビッグエンディアンのIPアドレスを表すバイナリ4バイトとして表され、2はポートを表すことがわかりました。これを試みましたが、IPを入力する形式がわかりません

私は次のことを試みました

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

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

しかし、unpack( "Nn" $ binary)を使用してこれを元に戻そうとすると、この例ではIPアドレスの最初の部分が返されます。これは「12」になります。取得したトレントクライアントでこれを試してみます。 "内部サーバーエラー"

私もip2longを試しましたが、逆にすると長いIPが得られますが、これが正しい形式かどうかわからない場合は、6バイトでIPとポートを探していることがわかります。

私が間違っているところについてのどんな推測も大いにありがたいです

Vip32

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

バイナリに変換するには、最初に人間が読めるドット付き10進表記から、コンピュータが読める形式に変換する必要があります。文字列内pack()のドットは理解できません。.アドレスをその構成要素に分割し、それらをunsigned chars(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 に答える