-------------------------------------------------------------------
ioctl在socket中的一些用法及示例
函数 : ioctl(int fd, int request, void * arg)
定义 : <sys/ioctl.h>
功能 : 控制I/O设备, 提供了一种获得设备信息和向设备发送控制参数的手段.
参数 : int  fd      文件句柄. 用于socket时, 是socket套接字.
       int  request 函数定义的所有操作. 关于socket的操作, 定义在<linux/sockios.h>文件中.
       void *arg    指针的类型依赖于request参数.
 
以下表格从网上收集了request - arg指针类型的对应关系

类别

Request

说明

数据类型

 
 

SIOCATMARK 
SIOCSPGRP 
SIOCGPGRP

是否位于带外标记 
设置套接口的进程ID 或进程组ID 
获取套接口的进程ID 或进程组ID

int 
int 
int

 

FIONBIN 
FIOASYNC 
FIONREAD 
FIOSETOWN 
FIOGETOWN

设置/ 清除非阻塞I/O 标志 
设置/ 清除信号驱动异步I/O 标志 
获取接收缓存区中的字节数 
设置文件的进程ID 或进程组ID 
获取文件的进程ID 或进程组ID

int 
int 
int 
int 
int

 

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

ARP

SIOCSARP 
SIOCGARP 
SIOCDARP

创建/ 修改ARP 表项 
获取ARP 表项 
删除ARP 表项

struct arpreq 
struct arpreq 
struct arpreq

 

SIOCADDRT 
SIOCDELRT

增加路径 
删除路径

struct rtentry 
struct rtentry

I_xxx

socket最常用到的结构体: struct ifreq 定义在<net/if.h>.(包括struct ifconf/ifr_flags等的定义)

一、获取

以下例程通过ioctl获取设备"eth0"的IP/掩码/硬件址

#include "stdio.h"
#include "stdlib.h"
#include "string.h" #include "net/if.h"
#include "arpa/inet.h"
#include "linux/sockios.h" int main(int argc,char *argv[])
{
struct sockaddr_in *addr;
struct ifreq ifr;
char*address;
int sockfd; char *name = "eth0";
if( strlen(name) >= IFNAMSIZ)
printf("device name is error.\n"), exit(0); strcpy( ifr.ifr_name, name); sockfd = socket(AF_INET,SOCK_DGRAM,0); //get inet addr
if( ioctl( sockfd, SIOCGIFADDR, &ifr) == -1)
printf("ioctl error.\n"), exit(0); addr = (struct sockaddr_in *)&(ifr.ifr_addr);
address = inet_ntoa(addr->sin_addr); printf("inet addr: %s\n",address); //get Mask
if( ioctl( sockfd, SIOCGIFNETMASK, &ifr) == -1)
printf("ioctl error.\n"), exit(0); addr = (struct sockaddr_in *)&ifr.ifr_addr;
address = inet_ntoa(addr->sin_addr); printf("Mask: %s\n",address); //get HWaddr
u_int8_t hd[6];
if(ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
printf("hwaddr error.\n"), exit(0); memcpy( hd, ifr.ifr_hwaddr.sa_data, sizeof(hd));
printf("HWaddr: %02X:%02X:%02X:%02X:%02X:%02X\n", hd[0], hd[1], hd[2], hd[3], hd[4], hd[5]); exit(0);
}

  

 

二、设置

以下例程设置eth0的IP地址.

#include "stdio.h"
#include "stdlib.h"
#include "string.h" #include "net/if.h"
#include "arpa/inet.h"
#include "linux/sockios.h" int main(int argc,char *argv[])
{
char *dev = "eth0";
char *ip = "192.168.1.252"; struct ifreq ifr;
if( strlen(dev) >= IFNAMSIZ)
printf("device name error.\n"), exit(0);
else
strcpy( ifr.ifr_name, dev); int sockfd = socket(AF_INET,SOCK_DGRAM,0); //get inet addr
if( ioctl( sockfd, SIOCGIFADDR, &ifr) == -1)
printf("ioctl error.\n"), exit(0); struct sockaddr_in *addr = (struct sockaddr_in *)&(ifr.ifr_addr);
char * address = inet_ntoa(addr->sin_addr); printf("current inet addr: %s\n",address); //set inet addr
struct sockaddr_in *p = (struct sockaddr_in *)&(ifr.ifr_addr); p->sin_family = AF_INET;
inet_aton( ip, &(p->sin_addr)); if( ioctl( sockfd, SIOCSIFADDR, &ifr) == -1)
printf("ioctl error.\n"), exit(0);
else
printf("change inet addr to: %s\n", ip); //any OS need active dev.
/*ifr.ifr_flags |= IFF_UP;
if( ioctl( sockfd, SIOCSIFFLAGS, &ifr) == -1)
printf("active fault.\n"), exit(0);
else
printf("%s[%s] is working...\n", dev, ip);
*/ close(sockfd);
exit(1);
//end
}

  

屏蔽的代码用于设置IP后, 激活新设置. 多数系统不需要这步操作. 
而且这步仅作演示. 真实使用的时候, 至少应该
1. 获取当前ifr.ifr_flags
2. ifr.ifr_flags |= IFF_UP;

以上是ioctl的一些示例, 实战中灵活使用、举一反三.

ioctl在socket中的一些用法及示例的更多相关文章

  1. Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)

    Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...

  2. 网络编程------socketserver模块以及socket模块的更多用法.

    socketserver模块 内置模块 (其实现原理为并发) socketserver这个模块主要是为了解决: TCP协议中,服务器不能同时连接多个客户端的问题 是处于socket抽象层和应用层之间的 ...

  3. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  4. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  5. SQL中distinct的用法

    SQL中distinct的用法   1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...

  6. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  7. jQuery中Animate进阶用法(一)

    jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...

  8. [转载]js中return的用法

    一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return;  在大多数情况下,为事件处理函 ...

  9. js中this的用法

    经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay

随机推荐

  1. Canvas和SVG的基础知识,以及两者的区别(小白)

    首先我们来说一下Canvas是什么,它有什么作用以及它的知识点. Canvas是<HTML5>的新标签,它通常用于通过脚本(也就是JavaScript)来绘制图像.但是它本身并没有绘制能力 ...

  2. 344 Reverse String 反转字符串

    请编写一个函数,其功能是将输入的字符串反转过来.示例:输入:s = "hello"返回:"olleh"详见:https://leetcode.com/probl ...

  3. webHttpBinding+wsHttpBinding+basicHttpBinding的区别 (转)

    1. webHttpBinding (web AJAX/JSON)2. wsHttpBinding (ASP.NET client) 3. basicHttpBinding (Silverlight) ...

  4. 自学Python十二 战斗吧Scrapy!

    初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 还是先推荐几个学习的教程:Scrapy 0.2 ...

  5. Linux 信息查询

    CPU信息查看 #查看CPU型号:   $>grep 'model name' /proc/cpuinfo |uniq    model name : Intel(R) Xeon(R) CPU ...

  6. maven——项目构建和依赖管理工具

    apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地 ...

  7. [Windows Server 2012] Apache+PHP安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...

  8. C# 统计字符串出现的个数

    string str1 = "123AAA456AAAA789AAAAAAA1011"; string str2 = "123456789AAA23456789AAAA3 ...

  9. vue项目的路由配置

    方案一.在生成项目的时候就选择安装路由; 这个地方选择y即可; 生成项目之后在src目录下会有router文件夹,里面有index.js,并且里面已经存在一个helloWorld页面了,可以直接模仿着 ...

  10. 笔记,js对象浅析

    学习笔记, 来源:http://www.cnblogs.com/zuiyirenjian/p/3535126.html 作者:醉意人间  此外,关于自运行函数可参考  http://benalman. ...