swordfish.cn 发表于 2008-06-27 22:06

原帖由 flw2 于 2008-6-27 18:37 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
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 ...

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

qks5201314 发表于 2008-06-28 07:48

感谢楼上诸位朋友的建议,我这就按照你们的方案来测试下,谢谢:em02:

dragchan 发表于 2008-06-28 10:29

如果LZ不想采用轮询算法,可以通过netlink socket来实现.

anhongkui 发表于 2008-06-28 10:31

原帖由 flw2 于 2008-6-27 18:37 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
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 ...
很强,又学习了一招

qks5201314 发表于 2008-06-28 13:21

回复 #9 flw2 的帖子

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

anhongkui 发表于 2008-06-28 13:22

原帖由 qks5201314 于 2008-6-28 13:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
:em02: 版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢

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

qks5201314 发表于 2008-06-28 14:08

哦,那你能给我解释下他做的那个函数里面的ioctl中的句柄以及其它一些的详细信息吗?

贺兰云天 发表于 2008-06-28 14:41

原帖由 qks5201314 于 2008-6-28 13:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
:em02: 版主,我不知道你的那个函数是在哪里的,不知道头文件是什么的?能告诉一下吗?或者告诉我去哪找也行;谢谢
ifconfig源码好像有,在net-tools包里:mrgreen:

//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 编辑 ]

flw2 发表于 2008-06-28 14:54

原帖由 dragchan 于 2008-6-28 10:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
如果LZ不想采用轮询算法,可以通过netlink socket来实现.
给大家贴一个吧
我知道设备状态改变了可以产生事件,但是没有用过

qks5201314 发表于 2008-06-28 15:08

thank you very much :em11:
页: 1 [2] 3 4
查看完整版本: 如何知道设备是否插网线