Re: [問題] 請問應用程式如何取得網路裝置
※ 引述《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)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 5 之 5 篇):
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章