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,socket,测试)