socket网络编程中的ioctl()函数

来源:互联网 发布:马克加索尔数据 编辑:程序博客网 时间:2024/06/17 02:39

网上关于socket网络编程中的ioctl()函数的资料整理收集。此博客作为自己的笔记。



Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息


ARP协议的基本内容,就是当仅仅知道对方主机的IP地址要求获取对方的MAC地址。
ARP高速缓存里边保存了之前进行ARP会话时返回的ARP应答中的IP地址和MAC地址对应列表。一般一条记录保存20分钟左右。
目的是:下次再要访问ARP高速缓存中的IP地址的主机时,不需要再次发送ARP请求去获取MAC地址。直接从高速缓存中读取就可以了。可以有效缓解链路的压力。
在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。  

在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用



请求码

类别

Request

说明

数据类型

接 

SIOCGIFCONF 
SIOCSIFADDR 
SIOCGIFADDR 
SIOCSIFFLAGS 
SIOCGIFFLAGS 
SIOCSIFDSTADDR 
SIOCGIFDSTADDR 
SIOCGIFBRDADDR 
SIOCSIFBRDADDR 
SIOCGIFNETMASK 
SIOCSIFNETMASK 
SIOCGIFMETRIC 
SIOCSIFMETRIC 
SIOCGIFMTU 
SIOCxxx

获取所有接口的清单 
设置接口地址 
获取接口地址 
设置接口标志 
获取接口标志 
设置点到点地址 
获取点到点地址 
获取广播地址 
设置广播地址 
获取子网掩码 
设置子网掩码 
获取接口的测度 
设置接口的测度 
获取接口MTU 
(还有很多取决于系统的实现)

struct ifconf 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq 
struct ifreq



//查询目标IP地址

err=ioctl(s,SIOCGIFDSTADDR,&ifr);

if(!err){

inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);

printf("SIOCGIFDSTADDR:%s\n",ip);


//查询子网掩码

err=ioctl(s,SIOCGIFNETMASK,&ifr);

if(!err){

inet_ntop(AF_INET,&sin->sin_addr.s_addr,ip,16);

printf("SIOCGIFNETMASK:%s\n",ip);


//以上,参考http://www.360doc.com/content/13/0609/10/19525_291675355.shtml ioctl函数详解


原创粉丝点击