9

をチェックするには、C コードを使用した Linux のイーサネットのテスト ケースが必要eth0です。がダウンしている場合eth0は、ネットを有効にし、アップしているかどうかを確認し、テストに合格します。

4

5 に答える 5

13

リンクがアップしているかどうかを確認するには、次のようなことを試してください。ルート権限なしで動作します。

#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;
}
于 2013-04-09T14:52:53.083 に答える
3

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

于 2010-11-20T06:36:30.257 に答える
2

libudev を利用して /sys を回避したい場合があります:

http://www.signal11.us/oss/udev/
于 2010-11-20T06:54:21.523 に答える
1

ネットワークカードにIPアドレスが割り当てられているかどうかを確認するだけです。

次のようなものを使用して、指定されたネットワーク カード (たとえばeth0 )で lan が稼働しているかどうかを確認できます。

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

これは、IP アドレスが NIC に割り当てられているかどうかに基づいて、0 または 1 を返すだけです。

また、Yann Ramin の方法を使用して、すべての nic を一覧表示し、チェックを実行することもできます。


あなたが AC コードを探していることに気付きませんでした。タグを付けるのもいいかもしれません。

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

于 2012-09-08T10:26:09.023 に答える
1

この質問はやや重要なので、極端な年齢にもかかわらず、別の回答を追加します。文字列「up\n」または「down\n」のみを含む /sys/class/net/eth0/operstate の内容を読み取ることができます。

于 2015-03-31T14:17:26.443 に答える