Как проверить Ethernet в Linux? - PullRequest
       21

Как проверить Ethernet в Linux?

4 голосов
/ 20 ноября 2010

Мне нужен тестовый пример для Ethernet в Linux с использованием кода C для проверки eth0. Если eth0 не работает, мы включаем сеть, затем проверяем, работает ли и тест пройден.

Ответы [ 5 ]

9 голосов
/ 09 апреля 2013

Чтобы проверить, работает ли ссылка, попробуйте что-то вроде этого. Работает без прав 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;
}
2 голосов
/ 20 ноября 2010

Вы можете воспользоваться libudev, чтобы обойти / sys:

http://www.signal11.us/oss/udev/
2 голосов
/ 20 ноября 2010

Сетевые интерфейсы можно увидеть в sysfs: /sys/class/net/eth[x]. Там вы можете проверить ссылку, статус интерфейса и многое другое.

1 голос
/ 31 марта 2015

Поскольку этот вопрос несколько важен, я добавлю еще один ответ, несмотря на его крайний возраст. Вы можете прочитать содержимое / sys / class / net / eth0 / operstate, которое будет просто содержать строку «вверх \ n» или «вниз \ n».

1 голос
/ 08 сентября 2012

Я просто проверяю, назначен ли IP-адрес сетевой карте.

Вы можете использовать что-то вроде этого, чтобы проверить, работает ли lan на данной сетевой карте (скажем, eth0 ):

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

Это должно просто возвращать 0 или 1 в зависимости от того, назначен ли IP-адрес нику.

Также вы можете использовать метод Янна Рамина , чтобы составить список всех монет и выполнить проверку.

<Ч />

Я пропустил, заметив, что вы ищете код c. Может быть, добавление тега было бы хорошо.

В любом случае, я думаю, вы можете посмотреть на тот же файл ( ifconfig ) вручную в c, прочитав его для ip.

...