+ -
当前位置:首页 → 问答吧 → 嵌入式环境,判断网卡的物理连接

嵌入式环境,判断网卡的物理连接

时间:2010-08-06

来源:互联网

同样的代码在Linux PC上运行没问题,到了uclinux下就不行。
代码如下:
#include <sys/types.h>;
#include <sys/socket.h>;
#include <sys/ioctl.h>;
#include <net/if.h>;
#include <linux/sockios.h>;
#include <linux/types.h>;

struct mii_data {
    __u16   phy_id;
    __u16   reg_num;
    __u16   val_in;
    __u16   val_out;
};

int main()
{
    int skfd;
    struct ifreq ifr;
    struct mii_data *mii;

    if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket");
        exit(1);
    }

    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
    ifr.ifr_name[IFNAMSIZ-1] = 0;

    if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) {
        perror("ioctl");
        exit(1);
    }

    mii = (struct mii_data *)&ifr.ifr_data;
    mii->reg_num = 0x01;

    if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) {
        perror("ioctl");
        exit(1);
    }
    if (mii->val_out & 0x0004)
        puts("link ok");
    else
        puts("no link");

    close(skfd);

    return 0;
}

嵌入式下无论网线是否插好都显示link ok。
有人遇到这样的问题么,或做过类似的程序么--- 判断网卡的物理连接。
不能用ioctl ( *,SIOCETHTOOL,*),我的环境不支持这个操作

作者: xiaoQ008   发布时间: 2010-08-06

查一下你板子的网卡驱动 肯定有函数是判断物理连接的,因为这是必须的。
如果在ioctl里面没实现的话,你可以把它添加上去。

作者: klanet   发布时间: 2010-08-06

网卡驱动不是我写的,内核都是编译好的,

作者: xiaoQ008   发布时间: 2010-08-06