最近、あなたと同様の問題が発生しました。最終的に、 RFC3484のソート アルゴリズムを実装する をfile_get_contents()
呼び出すことがわかりました。getaddrinfo()
PHPソースコードのスニペット
PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, zend_string **error_string)
{
// skip...
if ((n = getaddrinfo(host, NULL, &hints, &res))) {
if (error_string) {
*error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
php_error_docref(NULL, E_WARNING, "%s", ZSTR_VAL(*error_string));
} else {
php_error_docref(NULL, E_WARNING, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
}
return 0;
}
//skip...
}
私たちは、この問題に対処するためのより良いアプローチは何かをまだ考えています。
編集:
RFC3484 のセクション 6 では宛先アドレス選択アルゴリズムが指定されており、ルール 9 は IPv4 に関連しています。
ルール 9: 最長一致プレフィックスを使用します。
DA と DB が同じアドレス ファミリに属している場合 (両方が IPv6 または両方が IPv4): CommonPrefixLen(DA, Source(DA)) > CommonPrefixLen(DB, Source(DB)) の場合、DA を優先します。同様に、CommonPrefixLen(DA, Source(DA)) < CommonPrefixLen(DB, Source(DB)) の場合、DB を優先します。
送信元アドレス192.168.1.100/24
と 4 つの候補宛先アドレス192.168.1.33/24
, 192.168.1.44/24
,192.168.2.55/24
があるとし192.168.2.66/24
ます。
上記のアドレスをバイナリ形式で表すと
S 192.168.1.100 11000000.10101000.00000001.01100100
-------------------------------------------------------
DA 192.168.1.33 11000000.10101000.00000001.00100001
DB 192.168.1.44 11000000.10101000.00000001.00101100
DC 192.168.2.55 11000000.10101000.00000010.00110111
DD 192.168.2.66 11000000.10101000.00000010.01000010
あなたはそれを見ることができます
CommonPrefixLen(DA, S) == CommonPrefixLen(DB, S) == 25 >
CommonPrefixLen(DC, S) == CommonPrefixLen(DD, S) == 22
SoDA
またはDB
のうち、元の DNS クエリで最初に来る方が、glibc
実装の最終的な宛先として選択されます。