Thomas Woltjer
Thomas Woltjer

Reputation: 398

Check if lan device is connected using c++ in linux

I have a device on my network (wi-fi with only static IP's) with a static IP address of 192.168.1.17. I use it in input for part of my code in a c++ program in linux, but if it disconnects/is powered off, the program stops responding because it tries to pull data from a non-existent location. Is there a way I can check if it disconnects so that I can stop the program before it goes out of control? Thanks for the helpful responses I know are coming!

Upvotes: 0

Views: 3700

Answers (2)

Rahul R Dhobi
Rahul R Dhobi

Reputation: 5806

Try to ping 192.168.1.17 before proceeding

int status = system("ping -c 2 192.168.1.17");  
if (-1 != status) 
{ 
    ping_ret = WEXITSTATUS(status); 

    if(ping_ret==0)
        cout<<"Ping successful"<<endl; ////Proceed 
    else
        cout<<"Ping not successful"<<endl; ///Sleep and agin check for ping
}

Upvotes: 1

Jayesh Bhoi
Jayesh Bhoi

Reputation: 25885

Use ioctl SIOCGIFFLAGS to check is the interface UP and RUNNING:

struct ifreq ifr;

memset( &ifr, 0, sizeof(ifr) );
strcpy( ifr.ifr_name, ifrname );

if( ioctl( dummy_fd, SIOCGIFFLAGS, &ifr ) != -1 )
{
    up_and_running = (ifr.ifr_flags & ( IFF_UP | IFF_RUNNING )) == ( IFF_UP | IFF_RUNNING );
}
else
{
    // error
}

Input variable is ifrname. It should be the interface name "eth0", eth1", "ppp0" ....

Because ioctl() needs a file descriptor as parameter, you can use for example some temporary UDP socket for that:

dummy_fd = socket( AF_INET, SOCK_DGRAM, 0 );

Remember to close the socket, when not used anymore.

See how to go very low-level and use ioctl(7). See lsif by Adam Risi for an example.

Upvotes: 2

Related Questions