博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux系统ioctl函数使用实例
阅读量:4140 次
发布时间:2019-05-25

本文共 5419 字,大约阅读时间需要 18 分钟。

由于源代码注释几乎没有,可能新手较难看懂。因此鄙人加上了注释,有些小错误的地方也改了一下,其它不多说了。

程序1:检测接口的 inet_addr,netmask,broad_addr

程序2:检查接口的物理连接是否正常

程序3:更简单一点测试物理连接

程序4:调节音量

 

程序1:检测接口的 inet_addr,netmask,broad_addr

 

可能用到的资料:

1.ioctl和struct ifreq  

    

    上面链接中的源代码,头文件需要自己修改一下

 

//程序1:检测接口的 inet_addr,netmask,broad_addr  
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
 
#include 
  #include 
  #include 
  #include 
    #include 
  #include 
    static void usage(){          printf("usage : ipconfig interface\n");          exit(0);  }    int main(int argc,char **argv)  {          struct sockaddr_in *addr;       //套接字地址结构体          struct ifreq ifr;               //用于ioctl          char *name, *address;           //网络设备的名字,地址          int sockfd;                     //套接子描述符            if(argc != 2) //参数不够                  usage();          else                  name = argv[1];              sockfd = socket(AF_INET, SOCK_DGRAM, 0); //打开一个数据流套接子          strncpy(ifr.ifr_name, name, IFNAMSIZ-1); //限制设备名的长度并截断,防止溢出              if(ioctl(sockfd, SIOCGIFADDR, &ifr)  == -1)     //用 SIOCGIFADDR 来获得接口地址                  perror("ioctl error"), exit(1);         //描述错误代码          addr = (struct sockaddr_in *)&(ifr.ifr_addr);          address = inet_ntoa(addr->sin_addr);            //地址转换          printf("inet addr: %s ",address);              if(ioctl(sockfd, SIOCGIFBRDADDR, &ifr)  ==  -1) //用 SIOCGIFBRDADDR 来获得广播地址                  perror("ioctl error"),exit(1);          addr = (struct sockaddr_in *)&ifr.ifr_broadaddr;          address = inet_ntoa(addr->sin_addr);          printf("broad addr: %s ",address);              if(ioctl(sockfd, SIOCGIFNETMASK, &ifr) == -1) //用 SIOCGIFNETMASK 来获得掩码地址                  perror("ioctl error"),exit(1);          addr = (struct sockaddr_in *)&ifr.ifr_addr;          address = inet_ntoa(addr->sin_addr);          printf("inet mask: %s ",address);            printf("\n");          exit(0);  } 

 

程序2:检查接口的物理连接是否正常

//程序2:检查接口的物理连接是否正常  
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
  #include 
  #include 
  #include 
  #include 
    typedef unsigned short u16;  typedef unsigned int u32;  typedef unsigned char u8;    #include 
  #include 
      int detect_mii(int skfd, char *ifname)  {          struct ifreq ifr;          u16 *data, mii_val;          unsigned phy_id;            //Get the vitals from the interface.          strncpy(ifr.ifr_name, ifname, IFNAMSIZ);            //MII=(媒介无关接口)          //PHY=物理链路          if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0)          {                  fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname,                  strerror(errno));                  (void) close(skfd);                  return 2;          }            data = (u16 *)(&ifr.ifr_data);          phy_id = data[0];          data[1] = 1;            //REG regedit          if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)          {                  fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name,                  strerror(errno));                  return 2;          }            mii_val = data[3];            return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);  }      int detect_ethtool(int skfd, char *ifname)  {          struct ifreq ifr;          struct ethtool_value edata;            memset(&ifr, 0, sizeof(ifr));          edata.cmd = ETHTOOL_GLINK;            strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1);          ifr.ifr_data = (char *) &edata;            //ETH : EtherNet n. 以太网O          /\tOOL 工具          if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1)          {                  printf("ETHTOOL_GLINK failed: %s\n", strerror(errno));                  return 2;          }            return (edata.data ? 0 : 1);  }    int main(int argc, char **argv)  {          int skfd = -1;          //套接子描述符          char *ifname;         //接口设备名          int retval;             //返回值            if( argv[1] )                  ifname = argv[1];          else                  ifname = "eth0";        //默认值            //打开一个套接子          if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 )          {                  printf("socket error\n");                  exit(-1);          }            //探测以太网设备          retval = detect_ethtool(skfd, ifname);            if (retval == 2)//上面失败情况下                  //探测物理链路                  retval = detect_mii(skfd, ifname);              close(skfd);            if (retval == 2)                  printf("Could not determine status\n");            if (retval == 1)                  printf("Link down\n");            if (retval == 0)                  printf("Link up\n");            return retval;  } 

 

程序3:更简单一点测试物理连接 

//程序3:更简单一点测试物理连接  
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
  #include 
  #define LINKTEST_GLINK 0x0000000a    struct linktest_value {          unsigned int    cmd;          unsigned int    data;  };    static  void  usage(const char * pname)  {          fprintf(stderr, "usage: %s 
\n", pname);          fprintf(stderr, "returns: \n");          fprintf(stderr, "\t 0: link detected\n");          fprintf(stderr, "\t%d: %s\n", ENODEV, strerror(ENODEV));          fprintf(stderr, "\t%d: %s\n", ENONET, strerror(ENONET));          fprintf(stderr, "\t%d: %s\n", EOPNOTSUPP, strerror(EOPNOTSUPP));          exit(EXIT_FAILURE);  }    static  int  linktest(const char * devname)  {          struct ifreq ifr;          struct linktest_value edata;          int fd;            // setup our control structures.          memset(&ifr, 0, sizeof(ifr));          strcpy(ifr.ifr_name, devname);//为什么没有用strncpy了            //open control socket.          fd = socket(AF_INET, SOCK_DGRAM, 0);          if(fd < 0 ) {                  return -ECOMM;          }            errno = 0;          edata.cmd = LINKTEST_GLINK;          ifr.ifr_data = (caddr_t)&edata;            if(!ioctl(fd, SIOCETHTOOL, &ifr)) {                  if(edata.data) {                          fprintf(stdout, "link detected on %s\n", devname);                          return 0;                  } else {                          errno=ENONET;                  }          }            perror("linktest");          return errno;  }    int  main(int argc, char *argv[])  {          if(argc != 2) {                  usage(argv[0]);          }          return linktest(argv[1]);  } 

 


 

程序4:调节音量 

可能用到的资料:

Linux的混音设备/dev/mixer  

//程序4:调节音量  
#include 
 
#include 
 
#include 
 
#include 
 
#include 
 
#include 
  #include 
  #include 
  #include 
  #include 
    #define  BASE_VALUE 257    int main(int argc,char *argv[])  {          int mixer_fd=0;          char *names[SOUND_MIXER_NRDEVICES]=SOUND_DEVICE_LABELS;          int value,i;            //检查参数          if (argc<3)          {                  printf("\nusage:%s dev_no.[0..24] value[0..100]\n\n",argv[0]);                  printf("eg. %s 0 100\n",argv[0]);                  printf("    will change the volume to MAX volume.\n\n");                  printf("The dev_no. are as below:\n");                  for (i=0; i

 

转载地址:http://vlhvi.baihongyu.com/

你可能感兴趣的文章
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>