14

C で IPv6 アドレスを解析して 128 ビット値に変換する方法を知りたいですか?

したがって、 のような 16 進アドレスは1:22:333:aaaa:b:c:d:e、128 ビットの同等のバイナリに変換する必要があります。問題は、IP アドレス::2が有効な IPv6 アドレスであるため、タイプとそのバリアントである可能性があることです。

入力はキーボードからであるため、ASCII 形式です。

4

7 に答える 7

15

POSIXinet_ptonを使用して、文字列をstruct in6_addr.

#include <arpa/inet.h>

  ...

const char *ip6str = "::2";
struct in6_addr result;

if (inet_pton(AF_INET6, ip6str, &result) == 1) // success!
{
    //successfully parsed string into "result"
}
else
{
    //failed, perhaps not a valid representation of IPv6?
}
于 2010-06-03T01:00:21.817 に答える
10

getaddrinfo()IPv6 アドレスを理解できます。ヒントで AF_INET6 と AI_NUMERICHOST (DNS ルックアップを防ぐため) を渡します。Linuxにはそれがあり、WindowsにはWindows XPの時点でそれがあります。

于 2010-06-03T00:55:10.587 に答える
2

C で IPv6 を解析するには、文字列 (16 進ブロックのコロン、サブネット ビットのスラッシュ) をトークン化するユーティリティ関数を自分で作成する必要があります。

  1. 生の IPv6 文字列をより小さな部分文字列にトークン化します。
  2. 空でない部分文字列を 16 進ブロックに変換します。(ASCII から 10 進数への変換)
  3. 前にゼロをパディングして、16 進ブロックを 2 バイトに拡張します。(先頭のゼロのみがトリミングされます)
  4. 完全な IPv6 には 8 つの 16 進ブロックが必要です。不足している 16 進ブロックを計算します。(ゼロのグループ化は 1 回だけ実行できます)
  5. 欠落している hex ブロックを再挿入します。(空の部分文字列のインデックスを使用)
于 2010-06-03T01:16:14.997 に答える
1

Rosetta にはいくつかの言語のサンプルがあります: https://rosettacode.org/wiki/Parse_an_IP_Address

于 2016-03-02T02:47:12.883 に答える
0

Windows では、WSAStringToAddressWindows 2000 以降で使用できる を使用できます。

于 2011-06-06T14:58:54.910 に答える