QNX下怎么检查网线断了?

在Windows下当插拔网线时,系统可以检测出来,QNX下可以实现类似的功能吗?xtang,又得你回答一下了。

除非你有网卡驱动的源码。 :frowning:

再问一个问题,哪个函数可以得到本地某个网口的IP,比如想知道EN0分配的IP

我用过一种比较笨的方法,就是利用ifconfig -a的输出信息。比如重定向到一个文件里,然后读这个文件找出en0的ip。是不是太笨啦:)

  1. devctl(fd, DCMD_IO_NET_GET_CONFIG, &config, sizeof(config), NULL))
  2. check config->flags & NIC_FLAG_LINK_DOWN

ioctl(sd, SIOCGIFADDR, …)

computer,xtang,能否再讲清楚些呢?fd,sd如何是如何与硬件对应起来的,比如en0对应的fd或sd如何得到呢?config的结构是如何定义的呢?

两个问题混在一起了。

对于论询网线的问题,

#include <hw/nicinfo.h>

int fd;
nic_config_t config;

fd = open("/dev/io-net/en0", O_RDONLY);
for (;;) {
   devctl(fd, DCMD_IO_NET_GET_CONFIG, &config, sizeof(config), NULL);
   if (config.flags & NIC_FLAG_LINK_DOWN) {
       printf("Link Down\n");
       break;
    }
    sleep(1);
}

不过,如上所示,这是一个轮询的方法。

关于查询特定界面的IP地址。

#include <stdio.h>
#include <sys/socket.h>
#include <sys/sockio.h>

#include <arpa/inet.h>
#include <net/if.h>

int main()
{
        int sd;
        struct ifreq ireq;
        struct sockaddr_in *sin = (struct sockaddr_in *)&ireq.ifr_addr;

        sd = socket(AF_INET, SOCK_DGRAM, 0);

        memset(&ireq, 0, sizeof(ireq));
        sprintf(ireq.ifr_name, "en0");
        ioctl(sd, SIOCGIFADDR, &ireq);
        printf("Address is %s\n", inet_ntoa(sin->sin_addr));
        return 0;
}

多谢,xtang

xtang,你说的检查网线断的方法我在6.3下试可以,但是在6.2下hw目录下找不到那个头文件,我拷贝过来编译在6.2下运行不行,检测不到,可是我的系统现在还没有升级到6.3,请问6.2下如何实现呢?

只适用于6.3