LINUX.ORG.RU

Определение сетевого кабеля


0

1

Доброго времени суток. Мой мозг интересует вопрос, который уже два дня не дает мне покоя - как программно (в моем случае это C/C++) определить подключен-ли (в данный момент) к eth0 сетевой кабель или не подключен?

В интернете нашел два решения и оба не рабочие:

Первое:

    int fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct ifreq ethreq;

    memset(&ethreq, 0, sizeof(ethreq));

    /* set the name of the interface we wish to check */
    strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
    /* grab flags associated with this interface */
    ioctl(fd, SIOCGIFFLAGS, &ethreq);

    if (ethreq.ifr_flags & IFF_RUNNING)
    {
        std::cout<<"Runing"<<std::endl; // всегда выводится это
    }
    else
    {
        std::cout<<"Not Runing"<<std::endl;   
    }
    close(fd);

Второе:

cat /sys/class/net/eth0/carrier - всегда равно единице.

★★★★

Последнее исправление: RiseOfDeath (всего исправлений: 3)

# ethtool eth0
...
Link detected: yes

Посмотри у них в исходнике, как сделано.

staseg ★★★★★
()

cat /sys/class/net/eth0/carrier - всегда равно единице.

carrier=1 - несущая есть IMHO, кабель вставлен. Выдернули кабель и удивись.

braboar ★★
()

Как правило за это отвечает сетевой чип, вы можете прочитать Status Register (регистр 1), бит 2 содержит Link Status (0 - link down, 1 - link up).

imb ★★
()

Я вижу два варианта:
1. Дернуть напрямую чип асмом, там бит должен стоять, если кабель подключен.
2. Дернуть ифконфиг и распарсить его выхлоп.
3. Посмотреть исходники ифконфига, где они дергают бит, который должен стоять, если кабель подключено и дернуть у себя так же.

Zhbert ★★★★★
()
Ответ на: комментарий от RiseOfDeath

Странно...

Только что проверил - при выдернутом кабеле

cat /sys/class/net/eth0/carrier
выводит 0, при вставленном - 1. Тот ли кабель был выдернут? :-D

Кстати, можно еще проверять содержимое файла в той же директории operstate: там может быть текст up/down/unknown.

braboar ★★
()

cat /sys/class/net/eth0/carrier - всегда равно единице.

А ethtool что пишет?

true_admin ★★★★★
()
Ответ на: Странно... от braboar

выводит 0, при вставленном - 1. Тот ли кабель был выдернут? :-D

В обоих случаях единицу выводит.

Кстати, можно еще проверять содержимое файла в той же директории operstate: там может быть текст up/down/unknown.

выводит unknown

RiseOfDeath ★★★★
() автор топика

udev можно спросить. Примера на С под рукой нет.

#udevadm  info --query=all --path=/devices/pci0000:000000:00:19.0/net/eth0 --attribute-walk|grep carrier
    ATTR{carrier}=="1"
fopen ★★
()
Ответ на: комментарий от Harald

А смысл. Ифконфиг в обоих случаях выводит одинаковый резльтат.

Кабель подключен:

eth0      Link encap:Ethernet  HWaddr 02:A7:52:8A:FC:22  
          inet addr:192.168.255.2  Bcast:192.168.255.255  Mask:255.255.255.0
          inet6 addr: fe80::a7:52ff:fe8a:fc22/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:5467 (5.3 KiB)
          Interrupt:90 

Кабель отключен:

eth0      Link encap:Ethernet  HWaddr 02:A7:52:8A:FC:22  
          inet addr:192.168.255.2  Bcast:192.168.255.255  Mask:255.255.255.0
          inet6 addr: fe80::a7:52ff:fe8a:fc22/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:5467 (5.3 KiB)
          Interrupt:90 

RiseOfDeath ★★★★
() автор топика
Ответ на: комментарий от testuser123

Специально проверил на другом компе с другой сетевухой - тоже самое.

RiseOfDeath ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.