2012-09-24 17 views
6

İki ayrı bölüme sahip bir programım var: Ağ arabirimi kablosuz LAN ve diğeri kablolu LAN bağlantısı olduğunda bunlardan biri çalıştırılmalıdır. . Programımın içinde bunu nasıl bilebilirim? Bu bilgiyi almak için hangi işlevi kullanmalıyım?(C, Linux) Ağ arabiriminin kablosuz veya kablolu olup olmadığını bilmek

+0

Ne olur? – unwind

+0

Kodun kablosuz kısmı, paralel olarak kablolu olanlar için kablosuz ve kablolu kısımlar için yürütülür. – deinocheirus

cevap

5

komut satırından iwconfig komutunu kullanabilirsiniz:

$ iwconfig 
lo  no wireless extensions. 
eth0  no wireless extensions. 

Eğer opak link yukarıda açıklıyor @ gibi, C kullanmak kaynakları almak ya ıoctl'ler görmek için strace kullanmanız gerekiyorsa()

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 usage Bkz:

#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"... 
+0

uhmm ... üzgünüm, oldukça yeniim. Hem cevabınızı hem de opaklarınızı "doğru cevap" olarak seçebilir miyim? – deinocheirus

+0

Ne yazık ki;) İkisini de kabul edebilirsin, ama sorunun cevabını en iyi cevaplayanı kabul etmelisin. Bu senin kararın :) –

+1

Burada örnek bir kod uygulamıştım: https://gist.github.com/edufelipe/6108057 –

2

Bunu C'den almak mümkündür.

Benzer soru ile ilgili bilgi için bu link'a bakın.

3

cihazınız adı varsa kullanmak gerek NETDEVICE, /sys/class/net/NETDEVICE/wireless dizininin varlığını kontrol etmek, kullanabileceğiniz bir yüklemedir. Bu sadece bir Linux yaklaşımıdır ve /sys'un hemen hemen her zaman normal durumda olduğu varsayılmaktadır. Ayrıca ioctl() ler ile uğraşmak yerine bu yöntemi komut dosyalarından kullanmak daha kolaydır.

2

Yalnızca kablosuz olan arabirimlerde bulunan kablosuz uzantı protokolü sürümünü döndüren ioctl(fd, SIOCGIWNAME) numaralı telefonu arayabilirsiniz.

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; 
} 

tam Örneğin bakınız: hepsi paralel olarak kullanılmakta olan birkaç ağ arayüzleri vardır https://gist.github.com/edufelipe/6108057

İlgili konular