1

1 つの IP が特定の IP 範囲に移動するかどうかを判断する PHP 関数がありますが、IP のネットワークとマスクを見つける方法がわかりません。誰でもこれを手伝ってもらえますか?

<?
// Example of calling and checking IP-address 192.168.0.4
// belonging to a network 192.168.0.0 with mask 255.255.255.248

if(ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
print "Address belongs to a netwok<BR>";
} else {
print "Address is out of subnetwork's range<BR>";
}

function ip_vs_net($ip,$network,$mask){
if(((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
return 1;
} else {
return 0;
}
}
?>
4

3 に答える 3

2

IP に基づいてマスクを見つけることはできません。サブネットが何であるかを知る必要があります。同じ IP が 32 のサブネットに存在する可能性があります。

于 2010-05-03T23:35:55.373 に答える
1

ちょっと、しかしそうではありません。外部ネットワークのネットマスクやネットワークを気にする必要はありません。

ただし、ネットワークの内部にいて、DHCP サーバーが使用可能な場合は、DHCP プロトコル経由でクエリを実行して、内部 (ローカル) ネットワーク設定を取得できます。LAN に接続している場合は、RIP プロトコルなどを使用してネットワーク デバイスと通信することもできます。ただし、nmap などを使用したある種のポート スキャンに関心があり、ネットワーキングにはあまり関心がないという方もいると思います...その場合は .. FUH :)

于 2010-05-03T23:37:41.840 に答える
1

IPアドレスがClassy(Class A、B、Cなど)の場合、サブネットマスクはアドレス範囲によって固定されているため、簡単に見つけることができました。

現在、CIDR では、連続したプレフィックスをサブネット マスクとして使用できるため、正確なサブネット マスクを知ることは不可能です。

ただし、上品なサブネットがあなたのケースでうまくいくかもしれません。何もないよりは断然いいです。この関数を使用してサブネット マスクを割り出すことができます。

function get_net_mask($ip) {
   if (is_string($ip)) {
      $ip = ip2long($ip);
   }
   if (($ip & 0x80000000) == 0) {
       $mask = 0xFF000000;
   } elseif (($ip & 0xC0000000) == (int)0x80000000) {
       $mask = 0xFFFF0000;
   } elseif (($ip & 0xE0000000) == (int)0xC0000000) {
       $mask = 0xFFFFFF00;
   } else {
       $mask = 0xFFFFFFFF;
   }
   return $mask;
}
于 2010-05-04T01:14:23.237 に答える