linux c设置/获取网卡参数

概述:

在这里插入图片描述

知识点梳理

关键字缩写

SIOC:socket i/o controls,套接字I/O控制

SIOCSIFFLAGS等ioctl()函数的请求

见glibc源码:
glibc\sysdeps\mach\hurd\bits\ioctls.h

/* socket i/o controls */
#define	SIOCADDRT	_IOW('r', 10, struct ortentry)	/* add route */
#define	SIOCDELRT	_IOW('r', 11, struct ortentry)	/* delete route */

#define	SIOCSIFADDR	_IOW('i', 12, struct ifreq)	/* set ifnet address */
#define	OSIOCGIFADDR	_IOWR('i',13, struct ifreq)	/* get ifnet address */
#define	SIOCGIFADDR	_IOWR('i',33, struct ifreq)	/* get ifnet address */
#define	SIOCGIFHWADDR	_IOWR('i',39, struct ifreq)	/* get hwaddress */

#define	SIOCSIFFLAGS	_IOW('i', 16, struct ifreq_short)/* set ifnet flags */
#define	SIOCGIFFLAGS	_IOWR('i',17, struct ifreq_short)/* get ifnet flags */

struct ifreq结构

见:glibc\sysdeps\gnu\net\if.h

/* Interface request structure used for socket ioctl's.  All interface
   ioctl's must have parameter definitions which begin with ifr_name.
   The remainder may be interface specific.  */

struct ifreq
  {
# define IFHWADDRLEN	6
# define IFNAMSIZ	IF_NAMESIZE
    union
      {
	char ifrn_name[IFNAMSIZ];	/* Interface name, e.g. "en0".  */
      } ifr_ifrn;

    union
      {
	struct sockaddr ifru_addr;
	struct sockaddr ifru_dstaddr;
	struct sockaddr ifru_broadaddr;
	struct sockaddr ifru_netmask;
	struct sockaddr ifru_hwaddr;
	short int ifru_flags;
	int ifru_ivalue;
	int ifru_mtu;
	struct ifmap ifru_map;
	char ifru_slave[IFNAMSIZ];	/* Just fits the size */
	char ifru_newname[IFNAMSIZ];
	__caddr_t ifru_data;
      } ifr_ifru;
  };

short int ifru_flags;接口标志

见:glibc\sysdeps\gnu\net\if.h

/* Standard interface flags. */
enum
  {
    IFF_UP = 0x1,		/* Interface is up.  */
# define IFF_UP	IFF_UP
    IFF_BROADCAST = 0x2,	/* Broadcast address valid.  */
# define IFF_BROADCAST	IFF_BROADCAST
    IFF_DEBUG = 0x4,		/* Turn on debugging.  */
# define IFF_DEBUG	IFF_DEBUG
    IFF_LOOPBACK = 0x8,		/* Is a loopback net.  */
# define IFF_LOOPBACK	IFF_LOOPBACK
    IFF_POINTOPOINT = 0x10,	/* Interface is point-to-point link.  */
# define IFF_POINTOPOINT IFF_POINTOPOINT
    IFF_NOTRAILERS = 0x20,	/* Avoid use of trailers.  */
# define IFF_NOTRAILERS	IFF_NOTRAILERS
    IFF_RUNNING = 0x40,		/* Resources allocated.  */
# define IFF_RUNNING	IFF_RUNNING
    IFF_NOARP = 0x80,		/* No address resolution protocol.  */
# define IFF_NOARP	IFF_NOARP
    IFF_PROMISC = 0x100,	/* Receive all packets.  */
# define IFF_PROMISC	IFF_PROMISC

    /* Not supported */
    IFF_ALLMULTI = 0x200,	/* Receive all multicast packets.  */
# define IFF_ALLMULTI	IFF_ALLMULTI

    IFF_MASTER = 0x400,		/* Master of a load balancer.  */
# define IFF_MASTER	IFF_MASTER
    IFF_SLAVE = 0x800,		/* Slave of a load balancer.  */
# define IFF_SLAVE	IFF_SLAVE

    IFF_MULTICAST = 0x1000,	/* Supports multicast.  */
# define IFF_MULTICAST	IFF_MULTICAST

    IFF_PORTSEL = 0x2000,	/* Can set media type.  */
# define IFF_PORTSEL	IFF_PORTSEL
    IFF_AUTOMEDIA = 0x4000,	/* Auto media select active.  */
# define IFF_AUTOMEDIA	IFF_AUTOMEDIA
    IFF_DYNAMIC = 0x8000	/* Dialup device with changing addresses.  */
# define IFF_DYNAMIC	IFF_DYNAMIC
  };
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取网卡信息,可以使用Boost库的asio和system模块。以下是一个示例代码,可以获取网卡名称、MAC地址和IP地址: ```c++ #include <boost/asio.hpp> #include <boost/system/error_code.hpp> #include <boost/asio/ip/address.hpp> #include <boost/asio/ip/network_v4.hpp> #include <boost/asio/ip/network_v6.hpp> #include <iostream> using namespace boost::asio; int main() { io_service io; boost::system::error_code ec; // 获取所有网卡信息 ip::tcp::resolver resolver(io); ip::tcp::resolver::query query(host_name(), ""); ip::tcp::resolver::iterator iter = resolver.resolve(query, ec); if (ec) { std::cerr << "Error: " << ec.message() << std::endl; return 1; } // 循环遍历每个网卡 for (; iter != ip::tcp::resolver::iterator(); ++iter) { ip::address addr = iter->endpoint().address(); // 忽略非IPv4和IPv6地址 if (addr.is_v4() || addr.is_v6()) { std::cout << "Interface: " << iter->interface_name() << std::endl; std::cout << "MAC Address: " << addr.to_string() << std::endl; // 获取IP地址 if (addr.is_v4()) { ip::address_v4::bytes_type ipv4_bytes = addr.to_v4().to_bytes(); ip::network_v4 network(ipv4_bytes, ip::address_v4::netmask(ec)); if (ec) { std::cerr << "Error: " << ec.message() << std::endl; return 1; } std::cout << "IP Address: " << network.address().to_string() << std::endl; } else { ip::address_v6::bytes_type ipv6_bytes = addr.to_v6().to_bytes(); ip::network_v6 network(ipv6_bytes, ip::address_v6::prefix_length(ec)); if (ec) { std::cerr << "Error: " << ec.message() << std::endl; return 1; } std::cout << "IP Address: " << network.address().to_string() << std::endl; } std::cout << std::endl; } } return 0; } ``` 在上面的代码中,我们使用了`ip::tcp::resolver`类来获取所有网卡的信息。然后,我们循环遍历每个网卡获取其名称、MAC地址和IP地址。获取IPv4地址时,我们还使用了`ip::network_v4`类来计算子网掩码,从而得到IP地址。获取IPv6地址时,我们使用了`ip::network_v6`类来计算前缀长度,从而得到IP地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值