Linux API/network2009.07.30 15:48
랜선을 뽑고 꼽으면 아래와 같은 메시지가 출력된다.

eth0 : link down
eth0 : link up

dmesg로 매번 감시할수도 없는 노릇이고 그래서 코드로 하는 법을 찾아 왔는데
아직까지는 컴파일도 못시켜 봤다..(써글넘의 타입)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <net/if.h>
#include <netinet/in.h>
#include <ctype.h>

typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;

#include <linux/sockios.h>
#include <linux/ethtool.h>

// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //
// Get the link status. This returns TRUE if the link is up and FALSE
// otherwise.
//
int32_t link_stat()
{
        int s;
        struct ifreq ifr;
        struct ethtool_value eth;

        if((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) == FAIL)
                ERRORS(Socket);

        bzero(&ifr, sizeof(ifr));
        strcpy(ifr.ifr_name, Eth0);
        ifr.ifr_data = (caddr_t) &eth;
        eth.cmd = ETHTOOL_GLINK;

        if(ioctl(s, SIOCETHTOOL, &ifr) == FAIL)
                ERRORS(Ioctl);
        (void)close(s);

        return (eth.data) ? TRUE:FALSE;
}

void main()
{
        int ret;
        ret = link_stat();

        if(ret == TRUE) printf("link up\n");
        else printF("link down\n");
}

[링크 : http://lkml.indiana.edu/hypermail/linux/kernel/0505.2/0754.html]
Posted by 구차니

댓글을 달아 주세요