關於ioctl函式的學習和使用

2021-06-22 09:19:02 字數 2439 閱讀 8486

在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函式返回的...