在ioctl函式之前,對它的認識是停留在系統呼叫介面,並無實際更深入的了解和掌握,因為學習和使用,讓我更加清楚了這個函式的「使命」。作為乙個初學者,秉承謙虛好學的態度,希望多多指教,共同進步。廢話不多說了。
使用:在網路程式設計方面,特別是網路伺服器程式對iotcl函式的使用是很經常的,使用iotcl獲取所在主機全部網路介面的資訊,包括:介面位址,是否支援廣播,是否支援多播等等。
原型:
#include int ioctl (int fd, int request,... /*void *arg*/);
返回:若成功則為0,若出錯則為-1
引數:
第乙個引數是int fd,使用是需傳入開啟的檔案描述符,當然包含一般檔案,裝置檔案,以及套接字檔案。
1. 套接字操作
2. 檔案操作
3. 介面操作
4. arp快取記憶體操作
5. 路由表操作
6. 流系統
第三個引數使用時傳入的是乙個指標,該指標的型別是依賴於第二個引數request的,猶如「種瓜得瓜」一般,在第二個引數中輸入對用的
套接字,檔案,介面等資料型別,那當然你需要乙個指向
套接字,檔案,介面等資料型別結構的儲存指標。
例項:羅列一些網路程式設計經常使用的標頭檔案包含mynet.h
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
通過eth0獲取本機的ipv4的位址;
#include "mynet.h"
int main(int argc, char* argv)
strncpy(ifr.ifr_name, inte***ce, ifnamsiz);
if (ioctl(skfd, siocgifaddr, &ifr) < 0)
close(skfd);
saddr = (struct sockaddr_in *) &ifr.ifr_addr;
inet_ntop(af_inet, &saddr->sin_addr, printaddr, sizeof(printaddr));
printf("ipv4 address: %s\n", printaddr);
return 0;
}
通過eth0獲取本機的ipv4的子網掩碼;
#include "mynet.h"
int main(int argc, char* argv)
strncpy(ifr.ifr_name, inte***ce, ifnamsiz);
if (ioctl(skfd, siocgifnetmask, &ifr) < 0)
close(skfd);
saddr = (struct sockaddr_in *) &ifr.ifr_addr;
inet_ntop(af_inet, &saddr->sin_addr, printaddr, sizeof(printaddr));
printf("ipv4 netmask: %s\n", printaddr);
return 0;
}
通過eth0獲取本機的ipv4的dns;
#include "mynet.h"
int main(int argc, char* argv), dnsname[80] = ;
fp = fopen("/etc/resolv.conf", "rb");
char *printaddr;
if(!fp)
while(fgets(buffer, sizeof(buffer), fp))
} return 0;
}
通過eth0獲取本機的ipv6的位址
;
include "mynet.h"
int main(int argc, char *argv)
for (ifa = ifaddr; ifa != null; ifa = ifa->ifa_next)
if (memcmp(host, "2001", 4) == 0)else
}else
} freeifaddrs(ifaddr);
exit(exit_success);
}
ioctl函式的使用方法
int ioctl int fd,undigned long cmd,由於使用了一連串的 的緣故,這個原型在unix系統呼叫中顯得比較特別,通常 這些點代表可變數目的參數列。但是在實際系統中,系統呼叫不會真正使用可變數目 的引數,而是必須具有精確定義的原型,這是因為使用者程式只能通過硬體 門 才能訪...
Linux核心的ioctl函式學習
我這裡說的ioctl函式是在驅動程式裡的,因為我不知道還有沒有別的場合用到了ioctl,所以就規定了我們討論的範圍。為什麼要寫篇文章呢,是因為我前一陣子被ioctl給搞混了,這幾天才弄明白它,於是在這裡清理一下頭腦。一 什麼是ioctl。ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所...
Linux核心的ioctl函式學習
一 什麼是ioctl。ioctl是裝置驅動程式中對裝置的i o通道進行管理的函式。所謂對i o通道進行管理,就是對裝置的一些特性進行控制,例如串列埠的傳輸波特率 馬達的轉速等等。它的呼叫個數如下 int ioctl int fd,ind cmd,其中fd就是使用者程式開啟裝置時使用open函式返回的...