ネットワーク インターフェイスが無線 LAN の場合は 1 つ、有線 LAN 接続の場合はもう 1 つを実行する必要があります。プログラム内でそれを知るにはどうすればよいですか? その情報を取得するには、どの関数を使用すればよいですか?
4 に答える
デバイス名が の場合NETDEVICE
、ディレクトリの存在のチェックは、/sys/class/net/NETDEVICE/wireless
使用できる述語です。ただし、これは Linux のみのアプローチであり、マウントされていることを前提としています/sys
。これはほとんどの場合、通常のケースです。また、ioctl() を処理するよりも、スクリプトからこのメソッドを使用する方が簡単です。
ワイヤレス拡張プロトコル バージョンを返すを呼び出すことができますioctl(fd, SIOCGIWNAME)
。これは、ワイヤレスのインターフェイスでのみ使用できます。
int check_wireless(const char* ifname, char* protocol) {
int sock = -1;
struct iwreq pwrq;
memset(&pwrq, 0, sizeof(pwrq));
strncpy(pwrq.ifr_name, ifname, IFNAMSIZ);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
return 0;
}
if (ioctl(sock, SIOCGIWNAME, &pwrq) != -1) {
if (protocol) strncpy(protocol, pwrq.u.name, IFNAMSIZ);
close(sock);
return 1;
}
close(sock);
return 0;
}
完全な例については、https ://gist.github.com/edufelipe/6108057 を参照してください。
コマンドラインから iwconfig コマンドを使用できます。
$ iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
上記の @opaque のリンクで説明されているように、C から使用する必要がある場合は、ソースを取得するか、strace を使用して、使用する必要がある ioctls() を確認します。
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="lo", ifr_flags=IFF_UP|IFF_LOOPBACK|IFF_RUNNING}) = 0
write(2, "lo no wireless extensions"..., 35lo no wireless extensions.
) = 35
ioctl(3, SIOCGIWNAME, 0x7fff82c0d040) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
write(2, "eth0 no wireless extensions"..., 35eth0 no wireless extensions.
) = 35
SIOCGIWNAME の使用法を参照してください。
#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
* Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
NetworkManager を対象とする場合は、その API、C の例、およびNMDeviceTypeを参照してください。