ioctl 获取网卡信息为什么要掉用ioctlsocket fionbio

fcntl()&&ioctl()&&ioctlsocket()&&在socket网络中的不同
ioctl()& ioctlsocket()&
在socket网络中的不同:
&fcntl() 和 ioctl() 属于linux 系统下的函数
&ioctlsocket() 属于windows系统下的函数
&fcntl() 操作控制的对象是: 文件描述符
&ioctl() 操作控制的对象是: 硬件设备I/O通道
&ioctlsocket() 相当于 ioctl() 的一个子集。
&int fcntl(int fd, int cmd);
&int fcntl(int fd, int cmd, long arg);
&int fcntl(int fd, int cmd, struct flock
&int ioctl(int fd, int cmd, …);
&fcntl() 和 ioctl()
函数在本质上是有区别的,一个是对文件的操作,一个是对设备I/O的操作,但是在网络socket中,他们作用大概相似,都可以设置socket的是否允许非阻塞模式,不过设置方式上略有不同:
&fcntl(sockfd, F_SETFL,
fcntl(sockfd, F_GETFL, 0) |
O_NONBLOCK);&
&ioctl(sockfd, FIONBIO,
1);& 1:非阻塞
&ioctlsocket(sockfd,
FIONBIO, 1);&
&其他地方的用法,就不做深究,但是我们需要知道的是 fcntl()
可以对一个已打开的文件描述符进行操作,设置或者获取其当前的状态。
int setsockopt(int sockfd, int level, int optname, void *optval,
socklen_t *optlen);& --设置套接字选项
&sockfd:&&&&
&level:&&&&&
协议层& SOL_SOCKET/IPPROTO_IP/IPPRO_TCP
&optname:&&&
选项名& 每一个协议层都有其固定的选项名
&optval:&&&&
缓冲区& set是指向将要存放的地址, get是指向目前存放信息的地址
&optlen:&&&&
缓冲区大小长度
&需要说的是, 在socket层, 有以下一些选项:
&SO_BROADCAST&&&&
&&&&允许发送广播数据&&&&&&&&&&&&int
&SO_DEBUG        允许调试                int
&SO_DONTROUTE      不查找路由               int
&SO_ERROR        获得套接字错误             int
&SO_KEEPALIVE      保持连接                int
&SO_LINGER        延迟关闭连接              struct
&SO_OOBINLINE      带外数据放入正常数据流         int
&SO_RCVBUF        接收缓冲区大小             int
&SO_SNDBUF        发送缓冲区大小             int
&SO_RCVLOWAT       接收缓冲区下限             int
&SO_SNDLOWAT       发送缓冲区下限             int
&SO_RCVTIMEO       接收超时                struct
&SO_SNDTIMEO       发送超时                struct
&SO_REUSERADDR      允许重用本地地址和端口         int
&SO_TYPE         获得套接字类型             int
&SO_BSDCOMPAT      与BSD系统兼容              int
&使用 SO_RECVBUF 和 SO_SENDBUF
可以改变缺省缓冲区大小&例:
&&//设置接收缓冲区大小
n_recvbuf = 32 * 1024;
&&setsockopt(sockfd, SOL_SOCKET,
SO_RECVBUF, (const char*)&n_recvbuf,
sizeof(int));&&
&&//设置发送缓冲区大小
n_sendbuf = 32 * 1024;
&&setsockopt(sockfd, SOL_SOCKDET,
SO_SENDBUF, (const char*)&n_sendbuf,
sizeof(int));&
SO_REUSERADDR:&&1.当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程&
序就要用到该选项。
&&2.SO_RESUERADDR允许同一port上启动同一服务器的多个实例(多个进程),但每个实例绑定的IP地址是不能相同的。
&&3.SO_RESUERADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。
&&4.SO_RESUERADDR允许完全相同的地址和端口的重复绑定,但这只用于UDP的多播,不用于TCP。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 291094
博文数量: 168
博客积分: 60
博客等级: 民兵
技术积分: 338
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 系统运维
原文地址: 作者:
&SOL_SOCKET、IPPROTO_IP、IPPROTO_TCP和NSPROTO_IPX选项级别&int&PASCAL&setsockopt&(&__in&SOCKET&s,/*套接字*/__in&int&level,&/*选项级别*/__in&int&optname,/*&选项级别*/__in&const&char&*&optval,/*&目标选项的值*/__in&int&optlen&);/*&目标选项的值*/int&PASCAL&getsockopt(&__in&SOCKET&s,&/*套接字*/__in&int&level,&/*选项级别*/__in&int&optname,&/*&选项级别*/__out&char* optval,&/*&返回目标选项的值*/__inout&int&* optlen);&/*&返回目标选项的值*/&SOL_SOCKET选项级别选项值类型获取/设置Socket版本说明SO_ACCEPTCONN布尔值只能获取1+如为TRUE(真) ,表明套接字处于监听模式Chapter 9&Page 1SO_BROADCAST布尔值两种均可1+如TRUE,表明套接字已配置成对广播消息进行发送Chapter 9&Page 2~3SO_CONNECT_TIME整数只能获取1+返回套接字建立连接的时间,以秒为单位,如尚未连接,返回0xffffffff&&(微软专用)Chapter 9&Page 3SO_DEBUG布尔值两者均可1+如果TRUE,就允许调试输出&(W32不支持)&Chapter 9&Page 3SO_DONTLINGER布尔值两者均可1+如果是TRUE,则禁用SO_LINGER&Chapter 9&Page 3SO_LINGERstruct linger两者均可1+设置或获取当前的拖延值Chapter 9&Page 5~6SO_DONTROUTE布尔值两者均可1+如果TRUE,便直接向网络接口发送消息,毋需查询路由表&(微软无效)&Chapter 9&Page 4SO_ERROR布尔值只能获得1+返回错误状态Chapter 9&Page 4SO_EXCLUSIVEADDRUSE布尔值两者均可2+如果TRUE,套接字绑定那个本地端口就不能重新被另一个进程使用Chapter 9&Page 4~5SO_KEEPALIVE布尔值两者均可1+如果TRUE,套接字就会进行配置,在会话过程中发送”保持活动”消息Chapter 9&Page 5SO_MAX_MSG_SIZE无符号整数只能获取2+对一个面向消息的套接字来说,一条消息的最大长度Chapter 9&Page 6SO_OOBINLINE布尔值两者均可1+如果是TRUE,带外数据就会在普通数据流中返回&(W32不支持)&Chapter 9&Page 6SO_PROTOCOL_INFOWSAPROTOCOL_INFO只能获得2+套接字绑定的那种协议的特征Chapter 9&Page 7SO_RCVBUF整数两者均可1+面向接收操作,为每个套接字分别获取或设置缓冲区长度Chapter 9&Page 7SO_REUSEADDR布尔值两者均可1+如果是TRUE,套接字就可与一个正由其他套接字使用的地址绑定到一起,或与处在T IME_WAIT状态的地址绑定到一起Chapter 9&Page 7~8SO_SNDBUF布尔值两者均可1+设置分配给套接字的数据发送缓冲区的大小&&Chapter 9&Page 8SO_TYPE整数只能获取1+返回指定套接字的类型(如SOCK_DGRAM和SOCK_STREAM等等)Chapter 9&Page 8SO_SNDTIMEO整数两者均可1+获取或设置套接字上的数据发送超时时间(以毫秒为单位)Chapter 9&Page 8SO_RCVTIMEO整数两者均可1+获取或设置与套接字上数据接收对应的超时时间值(以毫秒为单位)Chapter 9&Page 9SO_UPDATE_ACCEPT_CONTEXTSOCKET两者均可1+更新SOCKET状态&Chapter 9&Page 9&IPPROTO_IP选项级别选项值类型获取/设置Socket版本说明IP_OPTIONSchar[]两者均可1+设置或获取I P头内的I P选项&&Chapter 9&Page 16~17IP_HDRINCL布尔值两者均可2+如果是TRUE,IP头就会随即将发送的数据一起提交,并从读取的数据中返回,如下表Chapter 9&Page 18表IP_HDRINCL:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Chapter 9&Page 184位版本(ipv4 or ipv6)4位头长度(32位字一共有多少个)8位服务类型(参阅IP_TOS)16位总长(以字节为单位, ip头和数据共长)16位标识(对发出的每个ip包进行“唯一性”标定,&每发出一个数据包,系统都会递增这个值)3个1位标志&(仅在I P包需要分割为较小的包时才会用到)13位分段偏移&(仅在ip包需要分割为较小的包时才会用到)8位存在时间(参阅IP_TTL)8位协议类型(用于对进入的数据包组装,如:TCP, IDP, IGMP和ICMP等等)16位头检验和(校验和是指对整个I P头进行1 6位1的求余总和结果,&不针对实际的数据)32位源IP地址32位目标IP地址IP选项(如果有的话,详见IP_OPTIONS)数据表IP_HDRINCLIP_TOS整数两者均可1+IP服务类型Chapter 9&Page 19IP_TTL整数两者均可1+I P协议的“存在时间” (TTL)参数Chapter 9&Page 19IP_MULTICAST_IF无符号长整数两者均可1+获取或设置打算从它上面发出多播数据的本地接口&&Chapter 9&Page 20IP_MULTICAST_TTL整数两者均可1+为套接字获取或设置多播数据包的存在时间Chapter 9&Page 20IP_MULTICAST_LOOP布尔值两者均可1+如果TRUE,发至多播地址的数据将原封不动地“反射”或“反弹”回套接字的进入缓冲区&Chapter 9&Page 20IP_ADD_MEMBERSHIPstruct ip_mreq只能设置1+在指定的I P组内为套接字赋予成员资格&&Chapter 9&Page 20IP_DROP_MEMBERSHIPstruct ip_mre1只能设置1+将套接字从指定的I P组内删去(撤消成员资格)Chapter 9&Page 20IP_DONTFRAGMENT布尔值两者均可1+如果是TRUE,就不对I P数据报进行分段Chapter 9&Page 20&IPPROTO_TCP选项级别选项值类型获取/设置Socket版本说明TCP_NODELAY布尔值两者均可1+若为TRUE,&就会在套接字上禁用Nagle算法&(只适用于流式套接字)&Chapter 9&Page 21&NSPROTO_IPX选项级别选项值类型获取/设置Socket版本说明&(仅适用于Microsoft IPX/SPX)IPX_PTYPE整数两者均可1+获取或设置I P X包的类型Chapter 9&Page 21IPX_FILTERPTYP整数两者均可1+获取或设置准备过滤的IPX包之类型Chapter 9&Page 22IPX_STOPFILTERPTYPE整数只能设置1+删除为指定IPX包设置的过滤器Chapter 9&Page 22IPX_DSTYPE整数两者均可1+获取或设置SPX头中的数据流字段值Chapter 9&Page 22IPX_EXTENDED_ADDRESS布尔值两者均可1+如果是TRUE,便允许对I P X包进行扩展定址Chapter 9&Page 22IPX_RECVHDR布尔值两者均可1+如果是T R U E,就随接收调用一起,返回IPX头Chapter 9&Page 22IPX_MAXSIZE整数只能获取1+返回I P X数据报的最大长度Chapter 9&Page 22IPX_ADDRESSIPX_ADDRESS_DATA只能获取1+返回具备I P X能力之适配器的有关信息Chapter 9&Page 22IPX_GETNETINFOIPX_NETNUM_DATA只能获取1+返回与一个指定I P X网络编号有关的信息Chapter 9&Page 23IPX_GETNETINFO_NORIPIPX_ADDRESS_DATA两者均可1+返回与一个指定I P X网络编号有关的信息Chapter 9&Page 23IPX_SPXGETCONNECTIONSTATUSIPX_SPXCONNSTATUS_DATA只能获取1+返回与一个已建立连接的S P X套接字有关的信息&Chapter 9&Page 23IPX_ADDRESS_NOTIFYIPX_ADDRESS_DATA只能获取1+若I P X适配器的状态发生改变,则发出异步通知&&Chapter 9&Page 24IPX_MAX_ADAPTER_NUM整数只能获取1+返回存在的IPX适配器个数Chapter 9&Page 24~25IPX_RERIPNETNUMBERIPX_NETNUM_DATA只能获取1+返回一个网络编号的相关信息Chapter 9&Page 25IPX_RECEIVE_BROADCAST布尔值只能设置1+如果是TRUE,就不接收IPX广播包Chapter 9&Page 25PX_IMMEDIATESPXZCK布尔值两者均可1+如果是TRUE,就不在SPX连接上延迟发送ACK&Chapter 9&Page 25~26&int&WSAAPI&WSAIoctl(&&&__in&SOCKET&s,&/*套接字*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in&DWORD&dwIoControlCode,&/*预定义的标志*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in_bcount_opt(cbInBuffer)&LPVOID&lpvInBuffer,&/*指向传递进入的值*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in&DWORD&cbInBuffer,&/*传入数据的多少*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__out_bcount_part_opt(cbOutBuffer, *lpcbBytesReturned)&LPVOID&lpvOutBuffer,&/*返回信息缓冲区*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in&DWORD&cbOutBuffer,&/*缓冲区的字节长度*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__out&LPDWORD&lpcbBytesReturned,&/*实际返回的字节数*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in_opt&LPWSAOVERLAPPED&lpOverlapped,&/*重叠I/O&*/&&&&&&&&&&&&&&&&&&&&&&&&&&&__in_opt&LPWSAOVERLAPPED_COMPLETION_ROUTINE&lpCompletionRoutine);&/*重叠I/O回调函数*/int&PASCAL&FAR&ioctlsocket(&__in&SOCKET&s,&/*套接字*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&__in&long&cmd,&/*预定义的标志*/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&__inout&u_long&FAR&*argp);&/*命令参数*/IO控制命令函数输入输出Socket版本说明标准I/O控制命令FIONBIOioctlsocket/WSAIoct无符号长整数无1+将套接字置入非锁定模式,&而若设为0值,意味着套接字进入锁定模式Chapter 9&Page 26FIONREAD两者均可无无符号长整数1+返回在套接字上存在的数据量Chapter 9&Page 26SIOCATMARK两者均可无布尔值1+判断是否已读取了带外数据Chapter 9&Page 26~27其他I/O控制命令SIO_ENABLE_CIRCULAR-QUEUEINGWSAIoct布尔值布尔值2+如接收缓冲区队列溢出,则首先丢弃最早收到的消息Chapter 9&Page 27SIO_FIND_ROUTEWSAIoctSOCKADDR布尔值2+验证到指定地址的路由是否存在(W32不支持)Chapter 9&Page 27SIO_FLUSHWSAIoct无无2+判断是否已读取OOB数据Chapter 9&Page 27SIO_BROADCAST_ADDRESSWSAIoct无SOCKADDR2+为套接字地址家族返回一个广播地址Chapter 9&Page 28SIO_GET_EXTENSION_FUNCTION_POINTERWSAIoctGUID函数指针2+取得基层提供者特有一个函数指针Chapter 9&Page 28SIO_CHK_QOSWSAIoctDWORDDWORD2+为指定的套接字设置QOS属性Chapter 9&Page 28SIO_GET_QOSWSAIoct无QOS2+返回与套接字关联在一起的QOS结构Chapter 9&Page 29SIO_SET_QOSWSAIoctQOS无2+为指定套接字设置QOS属性Chapter 9&Page 29SIO_MULTIPOINT_LOOPBACKWSAIoct布尔值布尔值2+设置或调查多播数据是否循环返回套接字Chapter 9&Page 29SIO_MULTICAST_SCOPEWSAIoct整数整数2+设置或获取多播数据的存在时间值Chapter 9&Page 29~30SIO_KEEPLIVE_VALSWSAIocttcp_keepalivetcp_keepalive2+针对每一个连接,分别设置其TCP"保持活动”周期Chapter 9&Page 30SIO_RCVALLWSAIoct无符号整数无2+接收网络上的所有数据包Chapter 9&Page 30SIO_RCVALL_MCASTWSAIoct无符号整数无2+接收网络上的所有多播数据包Chapter 9&Page 30SIO_RCVALL_IGMPMCASTWSAIoct无符号整数无2+接收网络上的所有IGMP数据包Chapter 9&Page 31SIO_ROUTING_INTERFACE_QUERY两者均可SOCKADDR无2+可找到用来向远程机器发送数据的那个本地接口的地址Chapter 9&Page 31SIO_ROUTING_INTERFACE_CHANGEWSAIoctSOCKADDR无2+与一个端点连接的接口发生改变后,发出通知Chapter 9&Page 31SIO_ADDRESS_LIST_QUERYWSAIoct无SOCKET_ADDRESS_LIST2+返回套接字绑定的一系列接口的列表Chapter 9&Page 32SIO_ADDRESS_LIST_CHANGEWSAIoct无无2+本地接口发生变化时,发出通知Chapter 9&Page 32IO_GET_INTERFACE_LISTWSAIoct无INTERFCE_INFO[]2+返回本地接口列表Chapter 9&Page 33安全套接字层的I/O控制命令&(Windows 95/98、Windows NT以及Windows 2000&均不支持)SO_SSL_GET_CAPABILITIESWSAIoct无DWORD1返回Winsock安全提供者的功能,仅定义了SO_CAP_CLIENT标志&Chapter 9&Page 33SO_SSL_GET_FLAGSWSAIoct无DWORD1返回与套接字对应的s信道特有标志Chapter 9&Page 34SO_SSL_SET_FLAGSWSAIoctDWORD无1设置套接字s信道特有标志Chapter 9&Page 34SO_SSL_GET_PROTOCOLSWSAIoct无SSLPROTOCOLS1返回安全提供者支持的协议列表Chapter 9&Page 34SO_SSL_SET_PROTOCOLSWSAIoctSSLPROTOCOLS无1设置基层提供者应当支持的一个协议列表Chapter 9&Page 34SO_SSL_SET_VALIDATE_CERT_HOOKWSAIoctSSLVALIDATECERTHOOK无1为SSL身份凭据的接受设置校验函数Chapter 9&Page 34SO_SSL_PERFORM_HANDSHAKEWSAIoct无无1在已建立连接的套接字上开始安全联络操作Chapter 9&Page 35ATM I/O控制命令SIO_GET_NUMBER_OF_ATM_DEVICESWSAIoct无DWORD2+返回ATM适配器的数量Chapter 9&Page 35SIO_GET_ATM_ADDRESSWSAIoctDWORDATM_ADDRESS2+为指定设备返回ATM地址Chapter 9&Page 35SIO_ASSOCIATE_PVCWSAIoctATM_PVC_PARAMS无2+将套接字与一个永久虚拟回路关联起来Chapter 9&Page 35SIO_GET_ATM_CONNECTION_ID两者均可无ATM_CONNECTION_ID2+获取同套接字关联在一起的ATM连接ID&Chapter 9&Page 36
阅读(521) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Linux下利用ioctl函数获取网卡信息 - DoubleLi - 博客园
linux下的ioctl函数原型如下:
#include &sys/ioctl.h&
int ioctl(int handle, int cmd, [int *argc, int argv])
函数成功返回0,失败返回-1.
其相关命令接口如下:
SIOCATMARK
是否位于带外标记
设置套接口的进程ID 或进程组ID
获取套接口的进程ID 或进程组ID
设置/ 清除非阻塞I/O 标志
设置/ 清除信号驱动异步I/O 标志
获取接收缓存区中的字节数
设置文件的进程ID 或进程组ID
获取文件的进程ID 或进程组ID
SIOCGIFCONF
SIOCSIFADDR
SIOCGIFADDR
SIOCSIFFLAGS
SIOCGIFFLAGS
SIOCSIFDSTADDR
SIOCGIFDSTADDR
SIOCGIFBRDADDR
SIOCSIFBRDADDR
SIOCGIFNETMASK
SIOCSIFNETMASK
SIOCGIFMETRIC
SIOCSIFMETRIC
SIOCGIFMTU
获取所有接口的清单
设置接口地址
获取接口地址
设置接口标志
获取接口标志
设置点到点地址
获取点到点地址
获取广播地址
设置广播地址
获取子网掩码
设置子网掩码
获取接口的测度
设置接口的测度
获取接口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 表项
获取ARP 表项
删除ARP 表项
struct arpreq
struct arpreq
struct arpreq
struct rtentry
struct rtentry
在这里我们需要用到的结构体
#include&netinet/in.h&
struct sockaddr_in {
short sin_ /* Address family */
unsigned short sin_ /* Port number */
struct&&sin_ /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
#include &net/if.h&
struct&ifreq{#define&IFHWADDRLEN&6union{charifrn_name[IFNAMSIZ];&} ifr_union&{structsockaddr ifru_structsockaddr ifru_structsockaddr ifru_structsockaddr ifru_struct&sockaddr ifru_shortifru_intifru_intifru_struct&ifmap ifru_charifru_slave[IFNAMSIZ];&charifru_newname[IFNAMSIZ];void&__user *&ifru_structif_settings ifru_} ifr_};
#define&ifr_name&ifr_ifrn.ifrn_name&#define&ifr_hwaddr&ifr_ifru.ifru_hwaddr&#defineifr_addr&ifr_ifru.ifru_addr&#defineifr_dstaddr&ifr_ifru.ifru_dstaddr&#defineifr_broadaddr&ifr_ifru.ifru_broadaddr&#defineifr_netmask&ifr_ifru.ifru_netmask#defineifr_flags&ifr_ifru.ifru_flags&#defineifr_metric&ifr_ifru.ifru_ivalue#defineifr_mtu&ifr_ifru.ifru_mtu#define&ifr_map&ifr_ifru.ifru_map#define&ifr_slave&ifr_ifru.ifru_slave#defineifr_data&ifr_ifru.ifru_data&#define&ifr_ifindex&ifr_ifru.ifru_ivalue#define&ifr_bandwidth&ifr_ifru.ifru_ivalue&#define&ifr_qlen&ifr_ifru.ifru_ivalue#define&ifr_newname&ifr_ifru.ifru_newname#define&ifr_settings&ifr_ifru.ifru_setting
ioctl函数能获取到IP地址、子网掩码、广播地址、硬件MAC地址等信息,至于网关及路由表比较复杂,在此不讨论。
具体代码如下:(测试通过)
#include &stdio.h&
#include &stdlib.h&
#include &net/if.h&
#include &unistd.h&
#include &sys/ioctl.h&
#include &arpa/inet.h&
#include &sys/stat.h&
#include &sys/types.h&
#include &errno.h&
#include &fcntl.h&
#include &netinet/in.h&
#include &net/route.h&
#include &string.h&
#include &net/if_arp.h&
int main()
& &struct sockaddr_in *
& &char *ip = new char(16);
& &char *netmask = new char(16);
& &char *broadcast = new char(16);
& &//char *ip = (char *)malloc(16);
& &char *mac = new &char(32);
& &//char *mac = (char *)malloc(32);
& &int socket_
& & & &if((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) & 0){
& & & & & & & &perror("socket");
& & & & & & & &exit(1);
& & & &memset(&ifr, 0, sizeof(ifr));
& & & &strcpy(ifr.ifr_name, "eth0");
& & & &memset(&sin, 0, sizeof(sin));
//获取IP地址
& & & &if(ioctl(socket_fd, SIOCGIFADDR, &ifr) != -1){
& & & & & & & &sin = (struct sockaddr_in *)&ifr.ifr_
& & & & & & & &strcpy(ip, inet_ntoa(sin-&sin_addr));
& & & & & & & &printf("IP address is %s\n", ip);
//获取广播地址
& & & &if(ioctl(socket_fd, SIOCGIFBRDADDR, &ifr) != -1){
& & & & & & & &sin = (struct sockaddr_in *)&ifr.ifr_
& & & & & & & &strcpy(broadcast, inet_ntoa(sin-&sin_addr));
& & & & & & & &printf("Broadcast is %s\n", broadcast);
//获取子网掩码
& & & &if(ioctl(socket_fd, SIOCGIFNETMASK, &ifr) != -1){
& & & & & & & &sin = (struct sockaddr_in *)&ifr.ifr_
& & & & & & & &strcpy(netmask, inet_ntoa(sin-&sin_addr));
& & & & & & & &printf("Net-mask is %s\n", netmask);
//获取硬件MAC地址
& & & &if(ioctl(socket_fd, SIOCGIFHWADDR, &ifr) != -1){
& & & & & & & &sin = (struct sockaddr_in *)&ifr.ifr_
& & & & & & & &sprintf(mac, "%02x:%02x:%02x:%02x:%02x:%02x",
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[0],
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[1],
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[2],
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[3],
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[4],
& & & & & & & &(unsigned char)ifr.ifr_netmask.sa_data[5]);
& & & & & & & &printf("Mac address is %s\n", mac);
& &return 0;
至于获取网关以及DNS,我是通过相关命令获得的。
主要代码如下:
//获取网关,利用route -n 命令可以看到相关的网关。连接标志是&UG&
if(gw_fd = popen("route -n | grep 'UG'", "r")){
& &fread(temp,1,128, gw_fd);
& &sscanf(temp, "%*s%s", szNetGate);
& &printf("Gateway is %s\n", szNetGate);
//获取DNS;一般DNS保存在/etc/reslov.conf文件中。具体获得方法要根据实际情况而定。
我的配置文件中是这样的
root@nill:/home/arm-none-linux# cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# & & DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 202.96.134.133 &
上面的202.96.134.133就是我需要获取的主DNS,没有备用DNS
if(dns_fd = popen("cat /etc/reslov.conf | grep 'nameserver'", "r")){
& &fread(temp,1,128, gw_fd);
& &sscanf(temp, "%*s%s%*s%s", szDNS1,szDNS2);
& &printf("DNS1 is %s",szDNS1);
& &printf("DNS2is %s", szDNS2);
转载地址:
相关地址:温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
一个怀揣着梦想的小菜鸟,一个没有任何背景的奋斗者
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2349)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'ioctl设置网卡混杂模式 Sniffer嗅探',
blogAbstract:'点:ioctl设置网卡混杂模式,setsockopt设置recvfrom过滤剩下的IP报文的进一步具体过滤(BPF格式) &作者:Gianluca Insolvibile整理:Seal(永远的FLASH)日期:嗅 探——Sniffer技术是网络安全领域里一项非常重要的技术!对于“Hacker”来说,他们可以以非常隐蔽的方式得到网络中传输的大量的敏感信息,如 Telnet,ftp帐号和密码等等明文传送的信息!与主动扫描相比,嗅探的行为更加难以被察觉,操作起来也不是很复杂!对于网络管理人员来说,可以利用 嗅探技术对网络活动进行监控,并及时发现各种攻击行为!在这篇文章里,我们主要探讨在Linux下如何利用C语言来实现一个Sniffer!我们将假设所有的主机在一个局域网内。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'一个怀揣着梦想的小菜鸟,一个没有任何背景的奋斗者',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 c ioctlsocket 的文章

 

随机推荐