|
程序1:检测接口的 inet_addr,netmask,broad_addr
程序2:检查接口的物理连接是否正常
程序3:更简单一点测试物理连接
程序4:调节音量
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
***************************程序1****************************************
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <sys/ioctl.h>
#include <net/if.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) static void usage() {
printf("usage : ipconfig interface \n");
exit(0);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main(int argc,char **argv)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
struct sockaddr_in *addr;
struct ifreq ifr;
char *name,*address;
int sockfd;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if(argc != 2)
usage();
else
name = argv[1];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
sockfd = socket(AF_INET,SOCK_DGRAM,0);
strncpy(ifr.ifr_name,name,IFNAMSIZ-1);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
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);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
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);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
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);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
printf("\n");
exit(0);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
******************************** 程序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>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned char u8;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <linux/ethtool.h>
#include <linux/sockios.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int detect_mii(int skfd, char *ifname)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
struct ifreq ifr;
u16 *data, mii_val;
unsigned phy_id;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//* Get the vitals from the interface. */
strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
fprintf(stderr, "SIOCGMIIPHY on %s failed: %s\n", ifname,
strerror(errno));
(void) close(skfd);
return 2;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
data = (u16 *)(&ifr.ifr_data);
phy_id = data[0];
data[1] = 1;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name,
strerror(errno));
return 2;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
mii_val = data[3];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int detect_ethtool(int skfd, char *ifname)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
struct ifreq ifr;
struct ethtool_value edata;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
memset(&ifr, 0, sizeof(ifr));
edata.cmd = ETHTOOL_GLINK;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1);
ifr.ifr_data = (char *) &edata;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
printf("ETHTOOL_GLINK failed: %s\n", strerror(errno));
return 2;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return (edata.data ? 0 : 1);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main(int argc, char **argv)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
int skfd = -1;
char *ifname;
int retval;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if( argv[1] )
ifname = argv[1];
else
ifname = "eth0";
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//* Open a socket. */
if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
printf("socket error\n");
exit(-1);
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
retval = detect_ethtool(skfd, ifname);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (retval == 2)
retval = detect_mii(skfd, ifname);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
close(skfd);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (retval == 2)
printf("Could not determine status\n");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (retval == 1)
printf("Link down\n");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (retval == 0)
printf("Link up\n");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return retval;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
*******************************程序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
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) struct linktest_value {
unsigned int cmd;
unsigned int data;
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
static
void
usage(const char * pname)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
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);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
static
int
linktest(const char * devname)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
struct ifreq ifr;
struct linktest_value edata;
int fd;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//* setup our control structures. */
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, devname);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//* open control socket. */
fd=socket(AF_INET, SOCK_DGRAM, 0);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(fd < 0 ) {
return -ECOMM;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
errno=0;
edata.cmd = LINKTEST_GLINK;
ifr.ifr_data = (caddr_t)&edata;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(!ioctl(fd, SIOCETHTOOL, &ifr)) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(edata.data) {
fprintf(stdout, "link detected on %s\n", devname);
return 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
errno=ENONET;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
perror("linktest");
return errno;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int
main(int argc, char *argv[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(argc != 2) {
usage(argv[0]);
}
return linktest(argv[1]);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
*************************************程序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>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define BASE_VALUE 257
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int main(int argc,char *argv[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif) {
int mixer_fd=0;
char *names[SOUND_MIXER_NRDEVICES]=SOUND_DEVICE_LABELS;
int value,i;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
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");
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if (argc<3)
exit(1);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if ((mixer_fd = open("/dev/mixer",O_RDWR))) {
printf("Mixer opened successfully,working \n");
value=BASE_VALUE*atoi(argv[2]);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
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");
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
exit(0);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
|