linux系统ioctl使用示例

linux系统ioctl使用示例

程序1:检测接口的 inet_addr,netmask,broad_addr
程序2:检查接口的物理连接是否正常
程序3:更简单一点测试物理连接
程序4:调节音量

*************************** 程序1 ****************************************
#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 *****************************************************
#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, 0sizeof(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 *****************************************************
#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, 0sizeof(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);
}


你可能感兴趣的:(linux系统ioctl使用示例)