• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    linux系統ioctl使用示例

    發布: 2007-7-04 12:06 | 作者: admin | 來源:  網友評論 | 查看: 27次 | 進入軟件測試論壇討論

    領測軟件測試網 I love linux and open source,but I love my girl more.

       

      These were writed and collected by kf701,
    you can use and modify them but NO WARRANTY.
      Contact with me : kf_701@21cn.com

    程序1:檢測接口的 .net_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, 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 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);
    }

    **********************************************************************************************

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>