9

重複の可能性:
IP アドレスから整数 - C

IP アドレスを次の形式の整数に変換するにはどうすればよいですか: AB . または ABC* または A. . .* または. . . IP アドレスが別の IP アドレスのサブセットであるかどうかを判断できる C プログラムを作成したいと考えています。たとえば、IP アドレス 192.168.125.5 は 192.168 のサブセットです。. . ここで、両方の IP アドレスを一意の整数に変換し、その後、一方が他方のサブセットであるかどうかを確認したいと考えています。これを達成する方法はありますか?

4

4 に答える 4

15

必要なのは、IP アドレスがサブネット内にあるかどうかを判断し、そのためにネットマスクを適用することです。おそらく(確かに)あなたが望むことをするためのライブラリがすでにそこにあります。これは、自分でロールしたい場合です。

この IP アドレスが信頼できるソース (つまり、ユーザーではない) からのものである場合は、次のようにして、標準の C 文字列から IP アドレスを簡単に抽出できます。

char ipAddressString[16] = "192.168.125.5"
char netMaskString[16] = "255.255.0.0"
char subnetString[16] = "192.168.0.0"

uint32_t ipAddress = parseIPV4string(ipAddressString);
uint32_t netmask = parseIPV4string(netmaskString);
uint32_t subnet = parseIPV4string(subnetString);

if (ipAddress & netmask == subnet) {
  return true;
}

uint32_t parseIPV4string(char* ipAddress) {
  char ipbytes[4];
  sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]);
  return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24;
}
于 2012-04-23T15:54:35.720 に答える
13

IP アドレス、たとえば 192.168.0.1 は、0xC0 0xA8 0x00 0x01 または単に 0xC0A80001 になる 16 進数で記述することにより、簡単に整数として書き込むことができます。

次に、これは単なるビット マッチングのケースなので、対応するサブネット マスク 255.255.0.0 を作成します。これはちょうど 0xFFFF0000 であり、次のようにして両方が一致することをテストできます。

0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000

ここで、等価テストの片側は「気になる基本要素」であり、反対側は実際のアドレスであり、特定のマスクは両側で同じです。

一般に、'*' を 0 に設定し、実際の数値を 0xFF に設定することで、適切なマスクを作成できます。より細かいマスクが必要な場合は、'*' で表現するのは困難です。

于 2012-04-23T15:47:35.993 に答える
1

簡単で一般的でない方法は、sscanf(int a、b、c、dを使用)を使用することです。 sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); ただし、すべてのセクションでIPを使用している場合にのみ機能します:10.47.100.1

そうでない場合でも、の戻り値を使用できますsscanf。これにより、一致するものがいくつ見つかったか(またはEOF)がわかります。

4つの数値を取得した後、サブセットの関係を確認できます。

于 2012-04-23T15:45:18.373 に答える
0

単一の整数 (32 ビットを想定) では、概要を説明するのに十分ではありません。アスタリスクを表現するには、さらに情報が必要です。

たとえば、(address,netmask) のペアを持つことができます。ここで、ネットマスクはいずれかが有効な上位ビットの数を表す単一の小さな整数であるため、たとえば「10.0.0.0」などのネットワーク アドレスは次のようになります。ペア (0x0a000000, 8) で表されます。なんらかの理由でアドレスの「どこでも」ワイルドカードを使用できるようにしたい場合は、アドレス ビットごとに 1 つのフラグ ビットの完全なセット、つまり 2 つの 32 ビット整数が必要です。次に、「192.168. .」のようなものをペア (0xc0a80000, 0xffff0000) として表すことができます。

于 2012-04-23T15:46:33.717 に答える