您好,欢迎来到划驼旅游。
搜索
您的当前位置:首页ioctl学习笔记

ioctl学习笔记

来源:划驼旅游
ioctl用例演示

程序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 \

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 \

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 \

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) < 0) {

fprintf(stderr, \"SIOCGMIIPHY on %s failed: %s\\n\ 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\ 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\ 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 #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\ fprintf(stderr, \"returns: \\n\");

fprintf(stderr, \"\ 0: link detected\\n\");

fprintf(stderr, \"\%d: %s\\n\ fprintf(stderr, \"\%d: %s\\n\

fprintf(stderr, \"\%d: %s\\n\ 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\ 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 #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\ printf(\"eg. %s 0 100\\n\

printf(\" will change the volume to MAX volume.\\n\\n\"); printf(\"The dev_no. are as below:\\n\"); for (i=0;iprintf(\"%s:%d\\\ }

printf(\"\\n\\n\");

if (argc<3)

exit(1);

if ((mixer_fd = open(\"/dev/mixer\

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); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务