获取以太网端口的ioctl文件描述符
我需要获取在Linux中以太网端口的ioctl()调用中使用的文件描述符。不确定如何执行此操作。只要使用打开套接字的文件描述符,使用传递给获取以太网端口的ioctl文件描述符,c,linux,ioctl,C,Linux,Ioctl,我需要获取在Linux中以太网端口的ioctl()调用中使用的文件描述符。不确定如何执行此操作。只要使用打开套接字的文件描述符,使用传递给ioctl()的ifreq结构中的设备名称,假设您的程序有足够的权限这样做 从文档中: Linux支持一些标准IOCTL来 配置网络设备。他们可以 可用于任何套接字的文件 描述符,不考虑族或 类型。它们传递一个ifreq结构: 套接字不需要绑定到目标设备,也不需要属于任何特定的系列。任何打开的套接字fd都可以(同样,具有适当的权限),只需为特定任务打开一个,等
ioctl()
的ifreq
结构中的设备名称,假设您的程序有足够的权限这样做
从文档中:
Linux支持一些标准IOCTL来
配置网络设备。他们可以
可用于任何套接字的文件
描述符,不考虑族或
类型。它们传递一个ifreq结构:
套接字不需要绑定到目标设备,也不需要属于任何特定的系列。任何打开的套接字fd都可以(同样,具有适当的权限),只需为特定任务打开一个,等待ioctl()
返回并关闭它
有关更多信息,请参阅man 7 netdevice
,或者如果您没有安装相应的文档包(提示,该包通常命名为manpages dev
或manpages devel
,具体取决于您的发行版)
您还可以查看nettools
包的源代码,根据发行版的不同,该包的名称可能会有所不同。这是ifconfig
(这里是Debian/Ubuntu)的源代码
对于最初的歧义,我很抱歉,我以为您正在尝试配置一个特殊的多功能设备(现在不确定为什么,可能是睡眠不足)。您可以这样做
fd=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP)
使用
strace
查看ifconfig调用了哪些函数。对不起,我不确定要打开的文件在哪里。我只是认为使用ioctl比解析ifconfig更容易。@Terminal-通常,是的,它是。。取决于您正在做什么。特定的ioctl()不关心家族,甚至不关心套接字是否绑定到相关接口。您是对的,但是ifconfig eth0使用此调用在eth0上设置ip地址。我想您的意思是“ifconfig调用什么函数”?不管怎样,任何打开的插座都可以工作。“magic”是在初始化的ifreq
结构的地址处指定的,通过ioctl()
传递给内核。那么fd甚至需要有效吗?我可以用1作为第一个参数吗?@Terminal:Yes,fd
必须是打开套接字的有效文件描述符。这使得内核知道将您的ioctl()
传递到套接字ioctl()
实现,而不是其他类型文件的无数其他ioctl()
实现。