2010-11-20 44 views

答えて

2

ネットワークインターフェイスはsysfs/sys/class/net/eth[x]です。ここで、リンク、インターフェイスのステータスなどを確認できます。

2

あなたは/ sysの中で周りを取得するためにlibudevを利用することもできます。

http://www.signal11.us/oss/udev/ 
1

IPアドレスがネットワークカードに割り当てられている場合、私は単にチェック。

/sbin/ifconfig eth0| grep 'inet addr:' | wc -l 

これは、単にかどうかをIPアドレスに基づいて、0または1を返す必要があります:

あなたはLANが与えられたネットワークカード(たとえばeth0の)にアップしているかどうかを確認するために、このようなものを使用することができますニックに割り当てられます。

また、ヤン・ラミンのメソッドを使用して、すべてのニックの&をチェックすることができます。


私はあなたがCコードを探しているのを忘れてしまった。たぶん、タグを追加すると良いでしょう。

どちらの方法でも、同じファイル(ifconfig)をcで手動でipで読むことができます。

9

リンクがアップしているかどうかを確認するには、次のようにしてください。 root特権なしで動作します。

#include <stdio.h>  // printf 
#include <string.h>  // strncpy 
//#include <sys/socket.h> // AF_INET 
#include <sys/ioctl.h> // SIOCGIFFLAGS 
#include <errno.h>  // errno 
#include <netinet/in.h> // IPPROTO_IP 
#include <net/if.h>  // IFF_*, ifreq 

#define ERROR(fmt, ...) do { printf(fmt, __VA_ARGS__); return -1; } while(0) 

int CheckLink(char *ifname) { 
    int state = -1; 
    int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); 
    if (socId < 0) ERROR("Socket failed. Errno = %d\n", errno); 

    struct ifreq if_req; 
    (void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name)); 
    int rv = ioctl(socId, SIOCGIFFLAGS, &if_req); 
    close(socId); 

    if (rv == -1) ERROR("Ioctl failed. Errno = %d\n", errno); 

    return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING); 
} 

int main() { 
    printf("%d\n", CheckLink("eth0")); 
} 

IFF_UPが設定されている場合は、インターフェイスがアップしていることを意味します(ifupを参照)。 IFF_RUNNINGが設定されている場合、インタフェースはプラグインされます。 ethtoolのioctl呼び出しも試しましたが、gidがrootでないときは失敗しました。しかし、ログのためだけに:

... 
#include <asm/types.h>  // __u32 
#include <linux/ethtool.h> // ETHTOOL_GLINK 
#include <linux/sockios.h> // SIOCETHTOOL 
... 
int CheckLink(char *ifname) { 
    ... 
    struct ifreq if_req; 
    (void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name)); 

    struct ethtool_value edata; 
    edata.cmd = ETHTOOL_GLINK; 
    if_req.ifr_data = (char*) &edata; 

    int rv = ioctl(socId, SIOCETHTOOL, &if_req); 
    ... 

    return !!edata.data; 
} 
+0

@TrueY:1つの質問ですが、リンクのステータスを取得したいと仮定して、ETHTOOL_GLINKとSIOCGIFFLAGSの違いを教えてください。 'ethtool_value.data == 1'は' IFF_UP'と 'IFF_RUNNING'を意味します。私はhttp://stackoverflow.com/questions/33039485/siocethtool-vs-siocgmiiphy-vs-siocgifflagsで詳細な質問をしました。私にあなたの考えを教えてください。 –

+0

@Vivekこれはかなり前のことでしたが、edata.data == 1ならインターフェイスがUPして実行中だと思います。 – TrueY

1

この質問は幾分重要なので、私は極端な年齢にもかかわらず別の答えを追加します。/sys/class/net/eth0/operstateの内容を読み取ることができます。これには単に "up \ n"または "down \ n"という文字列が含まれています。

関連する問題