免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: qks5201314
打印 上一主题 下一主题

如何知道设备是否插网线 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-27 22:06 |只看该作者
原帖由 flw2 于 2008-6-27 18:37 发表
short get_flags(const char *dev)
{
        struct ifreq ifr;

        bzero((char *)&ifr, sizeof(ifr));
        strcpy(ifr.ifr_name, dev);

        if (ioctl(ioctl_sockid,SIOCGIFFLAGS, (ch ...


很强大,熟悉内核就是不一样撒。

论坛徽章:
0
12 [报告]
发表于 2008-06-28 07:48 |只看该作者
感谢楼上诸位朋友的建议,我这就按照你们的方案来测试下,谢谢

论坛徽章:
0
13 [报告]
发表于 2008-06-28 10:29 |只看该作者
如果LZ不想采用轮询算法,可以通过netlink socket来实现.

论坛徽章:
0
14 [报告]
发表于 2008-06-28 10:31 |只看该作者
原帖由 flw2 于 2008-6-27 18:37 发表
short get_flags(const char *dev)
{
        struct ifreq ifr;

        bzero((char *)&ifr, sizeof(ifr));
        strcpy(ifr.ifr_name, dev);

        if (ioctl(ioctl_sockid,SIOCGIFFLAGS, (ch ...

很强,又学习了一招

论坛徽章:
0
15 [报告]
发表于 2008-06-28 13:21 |只看该作者

回复 #9 flw2 的帖子

版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢

论坛徽章:
0
16 [报告]
发表于 2008-06-28 13:22 |只看该作者
原帖由 qks5201314 于 2008-6-28 13:21 发表
版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢


应该是自己写的,熟悉内核协议栈后有感而发

论坛徽章:
0
17 [报告]
发表于 2008-06-28 14:08 |只看该作者
哦,那你能给我解释下他做的那个函数里面的ioctl中的句柄以及其它一些的详细信息吗?

论坛徽章:
0
18 [报告]
发表于 2008-06-28 14:41 |只看该作者
原帖由 qks5201314 于 2008-6-28 13:21 发表
版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢

ifconfig源码好像有,在net-tools包里

//ifconfig.c

/* Fetch the inteface configuration from the kernel. */
static int
if_fetch(char *ifname, struct interface *ife)
{
  struct ifreq ifr;

  memset((char *) ife, 0, sizeof(struct interface));
  strcpy(ife->name, ifname);

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) return(-1);
  ife->flags = ifr.ifr_flags;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(inet_sock, SIOCGIFADDR, &ifr) < 0) {
    memset(&ife->addr, 0, sizeof(struct sockaddr));
  } else ife->addr = ifr.ifr_addr;

  strcpy(ifr.ifr_name, ifname);
  
  if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) {
    memset(ife->hwaddr, 0, 32);
  } else memcpy(ife->hwaddr,ifr.ifr_hwaddr.sa_data,8);

  ife->type=ifr.ifr_hwaddr.sa_family;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
    ife->metric = 0;
  } else ife->metric = ifr.ifr_metric;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0) {
    ife->mtu = 0;
  } else ife->mtu = ifr.ifr_mtu;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(skfd, SIOCGIFMAP, &ifr) < 0) {
    memset(&ife->map, 0, sizeof(struct ifmap));
  } else memcpy(&ife->map,&ifr.ifr_map,sizeof(struct ifmap));

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(inet_sock, SIOCGIFDSTADDR, &ifr) < 0) {
    memset(&ife->dstaddr, 0, sizeof(struct sockaddr));
  } else ife->dstaddr = ifr.ifr_dstaddr;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(inet_sock, SIOCGIFBRDADDR, &ifr) < 0) {
    memset(&ife->broadaddr, 0, sizeof(struct sockaddr));
  } else ife->broadaddr = ifr.ifr_broadaddr;

  strcpy(ifr.ifr_name, ifname);
  if (ioctl(inet_sock, SIOCGIFNETMASK, &ifr) < 0) {
    memset(&ife->netmask, 0, sizeof(struct sockaddr));
  } else ife->netmask = ifr.ifr_netmask;


[ 本帖最后由 贺兰云天 于 2008-6-28 14:47 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-06-28 14:54 |只看该作者
原帖由 dragchan 于 2008-6-28 10:29 发表
如果LZ不想采用轮询算法,可以通过netlink socket来实现.

给大家贴一个吧
我知道设备状态改变了可以产生事件,但是没有用过

论坛徽章:
0
20 [报告]
发表于 2008-06-28 15:08 |只看该作者
thank you very much :em11:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP