ネットワークアダプタが接続されているかどうかを確認するにはどうすればよいですか?NSReachabilityを使用してインターネット接続を検出する例しか見つかりませんが、インターネット以外のネットワーク接続も検出したいと思います。eth0でIPアドレスを取得することは機能するはずですか?私はMacのみで作業しています。
3 に答える
AppleのテクニカルノートですべてのIPアドレスのリストを取得するTN1145には、ネットワークインターフェイスのステータスを取得するための3つの方法が記載されています。
- システム構成フレームワーク
- オープントランスポートAPI
- BSDソケット
システム構成フレームワーク:これはAppleが推奨する方法であり、TN1145にサンプルコードがあります。利点は、インターフェイス構成の変更を通知する方法を提供することです。
Open Transport API: TN1145にもサンプルコードがあります。それ以外の場合は、それについて多くを語ることはできません。(AppleのWebサイトには「レガシー」ドキュメントのみがあります。)
BSDソケット:これは、インターフェースのリストを取得し、接続ステータスを判別するための最も簡単な方法のようです(動的な変更通知が必要ない場合)。
次のコードは、「稼働中」のすべてのIPv4およびIPv6インターフェースを見つける方法を示しています。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <netdb.h>
struct ifaddrs *allInterfaces;
// Get list of all interfaces on the local machine:
if (getifaddrs(&allInterfaces) == 0) {
struct ifaddrs *interface;
// For each interface ...
for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) {
unsigned int flags = interface->ifa_flags;
struct sockaddr *addr = interface->ifa_addr;
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) {
if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {
// Convert interface address to a human readable string:
char host[NI_MAXHOST];
getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
printf("interface:%s, address:%s\n", interface->ifa_name, host);
}
}
}
freeifaddrs(allInterfaces);
}
アップルが提供する到達可能性コードを使用できます。「Reachability」ソースコードを入手できるリンクは次のとおりです。
このファイルをダウンロードすることもできます:GithubのTestWifi。Reachabilityクラスを実装する方法を示します。
これがお役に立てば幸いです。
Reachability
(基盤となるAPIに基づくAppleのデモクラスを意味していると思いSCNetworkReachability...
ます)ローカルネットワークを含む、IP接続されたすべてのホストで機能します。reachabilityForLocalWiFi
この方法を使用することもできますが、このページによると、ネットワークがアクティブであるがルーティングできない場合はYESが返されます。したがってreachabilityWithAddress:
、ローカルアドレスを使用してクエリを実行することをお勧めします。
これReachability
は、一部の人々が推奨するドロップインの代替品です。