linux系统ioctl使用示例

来源:互联网 发布:中山大学网络缴费平台 编辑:程序博客网 时间:2024/06/05 12:50

linux系统ioctl使用示例
These were writed and collected by kf701,
you can use and modify them but NO WARRANTY.
  Contact with me : kf_701@21cn.com
程序1:检测接口的 inet_addr,netmask,broad_addr
程序2:检查接口的物理连接是否正常
程序3:更简单一点测试物理连接
程序4:调节音量

注:在网上搜索了部分例子,发现在创建socket之后,完成操作之后都不调用close函数,个人尝试了下,linux下反复调用socket不关闭会导致资源消耗殆尽。


程序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, 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:

#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 0x0000000astruct linktest_value {        unsigned int    cmd;        unsigned int    data;};staticvoidusage(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);}staticintlinktest(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;}intmain(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 257int 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);}


参考:

http://www.linuxidc.com/Linux/2007-12/9623p3.htm






原创粉丝点击