Chinaunix

标题: linux系统ioctl使用示例 [打印本页]

作者: 风中残月    时间: 2009-05-22 14:03
标题: 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:调节音量
***************************程序1****************************************
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned char u8;
#include
#include
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)
#include
#include
#include
#include
#include
#include
#define LINKTEST_GLINK 0x0000000a
struct linktest_value {
        unsigned int    cmd;
        unsigned int    data;
};
static
void
usage(const char * pname)
{
        fprintf(stderr, "usage: %s \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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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);
        }
        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);
}
**********************************************************************************************
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/96145/showart_1935364.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2