ioctl在socket中的一些用法及示例
定义 : <sys/ioctl.h>
功能 : 控制I/O设备, 提供了一种获得设备信息和向设备发送控制参数的手段.
参数 : int fd 文件句柄. 用于socket时, 是socket套接字.
int request 函数定义的所有操作. 关于socket的操作, 定义在<linux/sockios.h>文件中.
void *arg 指针的类型依赖于request参数.
|
类别 |
Request |
说明 |
数据类型 |
|
套 |
SIOCATMARK |
是否位于带外标记 |
int |
|
文 |
FIONBIN |
设置/ 清除非阻塞I/O 标志 |
int |
|
接 |
SIOCGIFCONF |
获取所有接口的清单 |
struct ifconf |
|
ARP |
SIOCSARP |
创建/ 修改ARP 表项 |
struct arpreq |
|
路 |
SIOCADDRT |
增加路径 |
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中的一些用法及示例的更多相关文章
- Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa)
Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_n ...
- 网络编程------socketserver模块以及socket模块的更多用法.
socketserver模块 内置模块 (其实现原理为并发) socketserver这个模块主要是为了解决: TCP协议中,服务器不能同时连接多个客户端的问题 是处于socket抽象层和应用层之间的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- SQL中distinct的用法
SQL中distinct的用法 1.作用于单列 2.作用于多列 3.COUNT统计 4.distinct必须放在开头 5.其他 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
- jQuery中Animate进阶用法(一)
jQuery中animate的用法你了解多少呢?如果仅仅是简单的移动位置,显示隐藏,哦!天哪你在浪费资源!因为animate太强大了,你可以有很多意想不到的用法!让我们一起研究一下吧~~ 首先要了解j ...
- [转载]js中return的用法
一.返回控制与函数结果,语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二.返回控制,无函数结果,语法为:return; 在大多数情况下,为事件处理函 ...
- js中this的用法
经过近几周的模拟面试题,我查询了一些资料,今天就来说说,在js中this的用法吧.方法有四:第一,用作全局变量,第二,用作表该对象,第三,用作构造函数,第四,用作call和applay
随机推荐
- Canvas和SVG的基础知识,以及两者的区别(小白)
首先我们来说一下Canvas是什么,它有什么作用以及它的知识点. Canvas是<HTML5>的新标签,它通常用于通过脚本(也就是JavaScript)来绘制图像.但是它本身并没有绘制能力 ...
- 344 Reverse String 反转字符串
请编写一个函数,其功能是将输入的字符串反转过来.示例:输入:s = "hello"返回:"olleh"详见:https://leetcode.com/probl ...
- webHttpBinding+wsHttpBinding+basicHttpBinding的区别 (转)
1. webHttpBinding (web AJAX/JSON)2. wsHttpBinding (ASP.NET client) 3. basicHttpBinding (Silverlight) ...
- 自学Python十二 战斗吧Scrapy!
初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 还是先推荐几个学习的教程:Scrapy 0.2 ...
- Linux 信息查询
CPU信息查看 #查看CPU型号: $>grep 'model name' /proc/cpuinfo |uniq model name : Intel(R) Xeon(R) CPU ...
- maven——项目构建和依赖管理工具
apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地 ...
- [Windows Server 2012] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- C# 统计字符串出现的个数
string str1 = "123AAA456AAAA789AAAAAAA1011"; string str2 = "123456789AAA23456789AAAA3 ...
- vue项目的路由配置
方案一.在生成项目的时候就选择安装路由; 这个地方选择y即可; 生成项目之后在src目录下会有router文件夹,里面有index.js,并且里面已经存在一个helloWorld页面了,可以直接模仿着 ...
- 笔记,js对象浅析
学习笔记, 来源:http://www.cnblogs.com/zuiyirenjian/p/3535126.html 作者:醉意人间 此外,关于自运行函数可参考 http://benalman. ...