Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87829
  • 博文数量: 17
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-21 15:13
文章分类

全部博文(17)

文章存档

2011年(1)

2009年(16)

我的朋友

分类: C/C++

2009-03-12 17:24:42

程序1:检测接口的 inet_addr,netmask,broad_addr
***************************程序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:检查接口的物理连接是否正常
******************************** 程序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) < 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:更简单一点测试物理连接
*******************************程序3*****************************************************
#include
#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 < 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:调节音量
********************************程序4*********************************************************
#include
#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                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);
}
阅读(2150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~