作者ILYUJING ()
看板LinuxDev
标题Re: [问题] 请问应用程式如何取得网路装置
时间Sat Oct 20 14:30:40 2007
※ 引述《origo (补习班版在哪儿啊,告诉我)》之铭言:
: ※ 引述《ILYUJING (蟹)》之铭言:
: : 我想在user-space下利用ioctl取得网路装置的资讯
: : ioctl的系统呼叫如下:
: : int ioctl( int fd, int cmd, ...);
: : 关於fd我应该怎麽取得?
: : 我的意思是我怎麽在应用程式下开启网路装置?
: : 以及我需要include哪些lib?
: : #include<stdio.h>
: : ?
: : int main() {
: : int fd = ?
: : struct ifreq data;
: : ....
: : ioctl(fd,cmd,&data);
: : return 0;
: : }
: : → prudent:网路的fd,不就是用 socket 函式吗! 是指这个吗? 10/18 23:36
: 据我的了解和看过的写法,
: fd的部分,只要随便contruct的一个就行啦,
: 不管是TCP, UDP,RAW都可以,
: 重点是在 struct ifreq data中你要指定查询interface的名称,
: 例如 : eth0,
: 再利用cmd去指定要查询的项目就可以啦.
: 例如 : SIOCGIFNETMASK, SIOCGIFADDR.
: X
很感谢origo和各位板友的资讯
我依照origo的方式查询了struct ifreq的结构型态
(可参考../include/linux/if.h
..表示核心原始码程式的目录)
并将interface的名称(假设是eth3)传给ifreq的资料成员(data member), 如下:
strncpy(data.ifr_name, "eth3", 6);
然後使用系统呼叫ioctl():
ioctl(sockfd,MyDefIOCTL,&data);
确实可触发我所撰写的网路驱动程式中之do_ioctl()
不过这里我有一个疑问是, 关於ioctl()中的cmd的编号部分,
大家是直接去try数值, 还是利用系统提供的一些巨集?
目前我是直接丢核心中可能没用到的数值,
稍後我会参考欧莱里出版社出的那ㄧ本liinux device driver中的第六章,
利用一些巨集来取得cmd编号
由於char device driver的ioctl()和network device driver的do_ioctl()之prototype不一样
所以我对於两种驱动程式是否会分享cmd编号感到疑惑
不知道其他人是否有这方面的经验可分享?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.124.183.77
※ 编辑: ILYUJING 来自: 140.124.183.77 (10/20 14:37)