最近需要修改Linux下的网络参数,遂将Linux下用于控制网路参数的 ioctl常用函数记录一下,使用的时候注意使包裹对应的头文件,其中sockios.h文件包含所有的操作命令字,
#include <QCoreApplication>
#include <linux/socket.h>
//#include <linux/ioctl.h>
#include <linux/ethtool.h>
#include <linux/sockios.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include "unistd.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char *ethname = "eth0";
struct ifreq ifr;
int fd;
memset(&ifr,0,sizeof(ifr));
strcpy(ifr.ifr_name,ethname);
//open control socket
fd= socket(AF_INET,SOCK_DGRAM,0);
if(fd<0)
{
qDebug("cannot open control socket");
}
int error;
//struct ethtool_link_settings linkSet;
struct ethtool_value edata;
edata.cmd = 0x0000000a;
ifr.ifr_data = (caddr_t) &edata;
if(ioctl(fd,SIOCETHTOOL, &ifr) == -1)
{
printf ("GetLinkState : ioctl Error");
}
if(edata.data == 0)
{
qDebug("GetLinkState : down");
}
struct ethtool_cmd cmdGet;
//linkSet.cmd = ETHTOOL_GLINKSETTINGS;
cmdGet.cmd = ETHTOOL_GSET;
//ifr.ifr_data = (caddr_t)&linkSet;
ifr.ifr_data = (caddr_t)&cmdGet;
if(ioctl(fd,SIOCETHTOOL,&ifr) < 0)
{
qDebug("ioctl is error");
}
qDebug("the eth0 speed is %d Mb/s",cmdGet.speed);
qDebug("the etho duplex is %d",cmdGet.duplex);
//struct ethtool_cmd cmdSet;
cmdGet.cmd = ETHTOOL_SSET;
cmdGet.speed = 10;
cmdGet.duplex = 0;
cmdGet.autoneg = 1;
ifr.ifr_data = (caddr_t)&cmdGet;
if(ioctl(fd,SIOCETHTOOL,&ifr) < 0)
{
qDebug("ioctl is error");
}
memset(&cmdGet,0,sizeof(cmdGet));
cmdGet.cmd = ETHTOOL_GSET;
ifr.ifr_data = (caddr_t)&cmdGet;
if(ioctl(fd,SIOCETHTOOL,&ifr) < 0)
{
qDebug("ioctl is error");
}
qDebug("the eth0 speed is %d Mb/s",cmdGet.speed);
qDebug("the etho duplex is %d",cmdGet.duplex);
qDebug("the etho autoneg is %d",cmdGet.autoneg);
sleep(1);
if(ioctl(fd,SIOCETHTOOL,&ifr) < 0)
{
qDebug("ioctl is error");
}
qDebug("the eth0 speed is %d Mb/s",cmdGet.speed);
qDebug("the etho duplex is %d",cmdGet.duplex);
//set hwaddr
struct ifreq ifr;
char * pMacAddr[6]={0x00,0x01,0x02,0x03,0x04,0x05};
ifr.ifr_hwaddr.sa_data[0] = pMacAddr[0];
ifr.ifr_hwaddr.sa_data[1] = pMacAddr[1];
ifr.ifr_hwaddr.sa_data[2] = pMacAddr[2];
ifr.ifr_hwaddr.sa_data[3] = pMacAddr[3];
ifr.ifr_hwaddr.sa_data[4] = pMacAddr[4];
ifr.ifr_hwaddr.sa_data[5] = pMacAddr[5];
ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
if(ioctl(s, SIOCSIFHWADDR, &ifr) == -1)
{
printf("Set HWADDR failed\n");
}
//add multicast addr
struct ifreq ifr1;
ifr1.ifr_hwaddr.sa_data[0] = 0x01;
ifr1.ifr_hwaddr.sa_data[1] = 0x80;
ifr1.ifr_hwaddr.sa_data[2] = 0xC2;
ifr1.ifr_hwaddr.sa_data[3] = 0x00;
ifr1.ifr_hwaddr.sa_data[4] = 0x00;
ifr1.ifr_hwaddr.sa_data[5] = 0x0E;
ioctl(sockfd, SIOCADDMULTI, &ifr);
//delete multicast addr
struct ifreq ifr2;
ifr2.ifr_hwaddr.sa_data[0] = 0x01;
ifr2.ifr_hwaddr.sa_data[1] = 0x80;
ifr2.ifr_hwaddr.sa_data[2] = 0xC2;
ifr2.ifr_hwaddr.sa_data[3] = 0x00;
ifr2.ifr_hwaddr.sa_data[4] = 0x00;
ifr2.ifr_hwaddr.sa_data[5] = 0x0E;
ioctl(sockfd, SIOCDELMULTI, &ifr);
return a.exec();
}
本文为原创作品,如果对你有帮助,请点赞哦!