How to check Ethernet in Linux? How to check Ethernet in Linux? linux linux

How to check Ethernet in Linux?


To check if the link is up, try something like this. It works without root privileges.

#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"));}

If IFF_UP is set, it means interface is up (see ifup). If IFF_RUNNING is set then interface is plugged.I also tried using the ethtool ioctl call, but it failed when the gid was not root. But just for the log:

...#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;}


The network interfaces can be seen in sysfs: /sys/class/net/eth[x]. There you can check the link, interface status, and more.


You may want to take advantage of libudev to get around in /sys:

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