ioctl ---IO通道管理函数

来源:互联网 发布:最激励你的句子知乎 编辑:程序博客网 时间:2024/04/29 03:55

in_addr是存储ip地址的结构体  
  struct   in_addr{  
          u_int32_t   s_addr;  
  };  
   
  ifreq是跟网络接口有关的结构  
  /*  
    *   interface   request   structure   used   for   socket  
    *   ioctls.     all   interface   ioctls   must   have   parameter  
    *   definitions   which   begin   with   ifr_name.     the  
    *   remainder   may   be   interface   specific.  
    */  
   
  struct   ifreq    
  {  
  #define   ifhwaddrlen 6  
  #define ifnamsiz 16  
  union  
  {  
  char ifrn_name[ifnamsiz]; /*   if   name,   e.g.   "en0"   */  
  }   ifr_ifrn;  
   
  union   {  
  struct sockaddr   ifru_addr;  
  struct sockaddr   ifru_dstaddr;  
  struct sockaddr   ifru_broadaddr;  
  struct sockaddr   ifru_netmask;  
  struct     sockaddr   ifru_hwaddr;  
  short ifru_flags;  
  int ifru_ivalue;  
  int ifru_mtu;  
  struct     ifmap   ifru_map;  
  char ifru_slave[ifnamsiz]; /*   just   fits   the   size   */  
  char ifru_newname[ifnamsiz];  
  char   * ifru_data;  
  struct if_settings   ifru_settings;  
  }   ifr_ifru;  
  };

 

 

struct ifreq {

#define IFNAMSIZ 16

char ifr_name[IFNAMSIZ]; /* if name, e.g., "en0" */

union {

  struct sockaddr ifru_addr;

  struct sockaddr ifru_dstaddr;

  char ifru_oname[IFNAMSIZ]; /* other if name */

  struct sockaddr ifru_broadaddr;

  short ifru_flags;

  int ifru_metric;

  char ifru_data[1]; /* interface dependent data */

  char ifru_enaddr[6];

} ifr_ifru;

#define ifr_addr ifr_ifru.ifru_addr

#define ifr_dstaddr ifr_ifru.ifru_dstaddr

#define ifr_oname ifr_ifru.ifru_oname

#define ifr_broadaddr ifr_ifru.ifru_broadaddr

#define ifr_flags ifr_ifru.ifru_flags

#define ifr_metric ifr_ifru.ifru_metric

#define ifr_data ifr_ifru.ifru_data

#define ifr_enaddr ifr_ifru.ifru_enaddr

};*************程序1程序1:检测接口的 inet_addr,netmask,broad_addr****************************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
static void usage(){
        printf("usage : ipconfig interface /n");
        exit(0);
}
int main(int argc,char **argv)
{
        struct sockaddr_in *addr;
        struct ifreq ifr;
        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)
                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)
                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)
                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 <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <stdlib.h>
#include <unistd.h>
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned char u8;
#include <linux/ethtool.h>
#include <linux/sockios.h>
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);
        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;
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;
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";
/* Open a socket. */
        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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <sys/ioctl.h>
#define LINKTEST_GLINK 0x0000000a
struct linktest_value {
        unsigned int    cmd;
        unsigned int    data;
};
static
void
usage(const char * pname)
{
        fprintf(stderr, "usage: %s <device>/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);
/* 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调节音量*********************************************************
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <stdio.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#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;
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<SOUND_MIXER_NRDEVICES;i++){
                if (i%3==0) printf("/n");
                printf("%s:%d/t/t",names[i],i);
        }
        printf("/n/n");
if (argc<3)
                exit(1);
if ((mixer_fd = open("/dev/mixer",O_RDWR))){
                printf("Mixer opened successfully,working.../n");
                value=BASE_VALUE*atoi(argv[2]);
if (ioctl(mixer_fd,MIXER_WRITE(atoi(argv[1])),&value)==0)
                printf("successfully.....");
                else    printf("unsuccessfully.....");
                printf("done./n");
         }else
                printf("can't open /dev/mixer error..../n");
exit(0);
}
**********************************************************************************************

原创粉丝点击