をチェックするには、C コードを使用した Linux のイーサネットのテスト ケースが必要eth0
です。がダウンしている場合eth0
は、ネットを有効にし、アップしているかどうかを確認し、テストに合格します。
5 に答える
リンクがアップしているかどうかを確認するには、次のようなことを試してください。ルート権限なしで動作します。
#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;
}
ネットワーク インターフェイスは次の場所で確認できsysfs
ます/sys/class/net/eth[x]
。そこで、リンク、インターフェースのステータスなどを確認できます。
libudev を利用して /sys を回避したい場合があります:
http://www.signal11.us/oss/udev/
ネットワークカードにIPアドレスが割り当てられているかどうかを確認するだけです。
次のようなものを使用して、指定されたネットワーク カード (たとえばeth0 )で lan が稼働しているかどうかを確認できます。
/sbin/ifconfig eth0| grep 'inet addr:' | wc -l
これは、IP アドレスが NIC に割り当てられているかどうかに基づいて、0 または 1 を返すだけです。
また、Yann Ramin の方法を使用して、すべての nic を一覧表示し、チェックを実行することもできます。
あなたが AC コードを探していることに気付きませんでした。タグを付けるのもいいかもしれません。
どちらの方法でも、同じファイル ( ifconfig ) を c で手動で見ることができると思います。
この質問はやや重要なので、極端な年齢にもかかわらず、別の回答を追加します。文字列「up\n」または「down\n」のみを含む /sys/class/net/eth0/operstate の内容を読み取ることができます。