1. 使用ioctl方法判断驱动状态
#include
#include
#include
#include
#include
#include
#include
struct ethtool_value {
__uint32_t cmd;
__uint32_t data;
};
int main(int , char* [])
{
struct ethtool_value edata;
int fd = -1, err = 0;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "eth0");
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
perror("Cannot get control socket");
return 70;
}
edata.cmd = 0x0000000a;
ifr.ifr_data = (caddr_t)&edata;
err = ioctl(fd, 0x8946, &ifr);
if (err == 0) {
fprintf(stdout, "Link detected: %s/n",
edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get link status");
}
return 0;
}
转载:http://blog.csdn.net/21bird/article/details/3345459
如下同理(需要安装ethtool):
int detect_eth_cable(char *ifname) /*return 1:has cable; return 0:no cable*/
{
static int netfd = -1;//I don't close this socket;
struct ifreq ifr;
struct ethtool_value edata;
memset(&ifr, 0, sizeof(ifr));
edata.cmd = ETHTOOL_GLINK;
if(netfd == -1)
{
if ((netfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
fprintf(stderr, "create socket error: netfd=%d\n", netfd);
return 0;
}
}
strncpy(ifr.ifr_name,