C でローカル IP アドレスとサブネット マスクを決定する方法

DDD
リリース: 2024-11-10 02:38:02
オリジナル
660 人が閲覧しました

How to Determine the Local IP Address and Subnet Mask in C  ?

C でのローカル IP アドレスとサブネット マスクの取得

ネットワーク プログラミングの領域では、IP アドレスとサブネットを決定することが必要になることがよくあります。ローカルコンピュータのマスク。この情報は、ローカル ネットワーク上でのメッセージの送信など、さまざまな目的に使用できます。

ローカル IP アドレスとサブネット マスクを取得するタスクは簡単そうに見えますが、最初に思ったよりも複雑な場合があります。多くのコンピュータでは、異なるネットワーク インターフェイスに複数の IP アドレスが割り当てられている場合があります。したがって、どの IP アドレスが特定のネットワーク コンテキストに関連しているかを理解することが重要です。

場合によっては、プログラムが通信しているリモート コンピューターから IP アドレスを要求する方が有益な場合があります。このアプローチにより、特定のコンピューターから認識される IP アドレスを決定し、接続のコンテキストでの関連性を確保できます。

Unix/Mac の実装

Unix およびMac システムでは、ローカル マシンに関連付けられているすべての IP アドレスのリストを取得するには、getifaddrs() 関数を使用することをお勧めします。コード スニペットの例を次に示します。

#include <ifaddrs.h>

void GetNetworkInterfaceInfos() {
  struct ifaddrs *ifaddr;
  int status = getifaddrs(&ifaddr);
  if (status != 0) {
    // Error handling
  }

  for (struct ifaddrs *ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
    if (ifa->ifa_addr == NULL) {
      continue;
    }
    if (ifa->ifa_addr->sa_family == AF_INET) { // IPv4 address
      struct sockaddr_in *in = (struct sockaddr_in *)ifa->ifa_addr;
      printf("IP address: %s\n", inet_ntoa(in->sin_addr));

      // Get subnet mask if available
      if (ifa->ifa_netmask != NULL) {
        struct sockaddr_in *mask = (struct sockaddr_in *)ifa->ifa_netmask;
        printf("Subnet mask: %s\n", inet_ntoa(mask->sin_addr));
      }
    } else if (ifa->ifa_addr->sa_family == AF_INET6) { // IPv6 address
      // Handle IPv6 addresses here
    }
  }

  freeifaddrs(ifaddr);
}
ログイン後にコピー

Windows 実装

Windows では、GetAdaptersAddresses() 関数を使用して同様の機能を実現できます。

#include <iphlpapi.h>

void GetNetworkInterfaceInfos() {
  PIP_ADAPTER_ADDRESSES adapter_addresses;
  ULONG size = 0;
  GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size);
  adapter_addresses = (PIP_ADAPTER_ADDRESSES)HeapAlloc(GetProcessHeap(), 0, size);
  GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapter_addresses, &size);

  for (PIP_ADAPTER_ADDRESSES adapter = adapter_addresses; adapter; adapter = adapter->Next) {
    printf("IP address: %s\n", adapter->IpAddressList.IpAddress.String);

    // Get subnet mask if available
    if (adapter->SubnetMaskList.IpAddress.String) {
      printf("Subnet mask: %s\n", adapter->SubnetMaskList.IpAddress.String);
    }
  }

  HeapFree(GetProcessHeap(), 0, adapter_addresses);
}
ログイン後にコピー

追加考慮事項

複数の IP アドレスを扱う場合、特定の要件にどれが適しているかを検討することが重要です。この決定は、プログラムのコンテキストとネットワーク構成によって異なります。ローカル IP アドレス取得の微妙な違いを理解することで、この情報をさまざまなネットワーキング アプリケーションに効果的に活用できます。

以上がC でローカル IP アドレスとサブネット マスクを決定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート