套接字选项,超高级货,赛车的按钮盘
getsockopt和setsockopt
原型:int getsockopt(int s,int level,int opname,void *optval,socklen_t *optlen);
原型:int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);
s为将要获取或设置的套接字描述符,可以通过socket函数获取
level为选项所在的协议层
optname为选项名
optval操作的内存缓冲区
optlen第四个参数的长度
成功返回0,错误-1,errno如下
EBADF |
s不是有效的文件描述符 |
EFAULT |
optval指向的内存并非有效的进程空间的错误 |
EINVAL |
在setsockopt时optlen无效 |
ENOPROTOOPT |
指定协议层不能识别该选项 |
ENOTSOCK |
s不是套接字描述符 |
套接字选项含义
level |
optname |
含义 |
optval |
set |
get |
SOL_SOCKET (通用套接字选项) |
SO_BROADCAST |
表示允许发送广播数据包 |
int |
是 |
是 |
SO_DEBUG |
表示调试跟踪 |
int |
是 |
是 |
|
SO_DONTROUTE |
表示不进行路由表查询 |
int |
是 |
是 |
|
SO_ERROR |
表示数据获取 |
int |
否 |
是 |
|
SO_KEEPALIVE |
表示保持连接 |
int |
是 |
是 |
|
SO_LINGER |
表示延迟关闭连接 |
struct linger |
是 |
是 |
|
SO_OOBINLINE |
表示带外数据放入正常数据流 |
int |
是 |
是 |
|
SO_RCVBUF |
表示接受缓冲区大小 |
int |
是 |
是 |
|
SO_SNDBUF |
表示发送缓冲区大小 |
int |
是 |
是 |
|
SO_RCVLOWAT |
表示接受缓冲区下限 |
int |
是 |
是 |
|
SO_SNDLOWAT |
表示发送缓冲区下限 |
int |
是 |
是 |
|
SO_RCVTIMEO |
表示接收超时 |
struct timeval |
是 |
是 |
|
SO_SNDTIMEO |
表示发送超时 |
struct timeval |
是 |
是 |
|
SO_REUSEADDR |
表示允许本地地址重用 |
int |
是 |
是 |
|
SO_TYPE |
表示获取套接字类型 |
int |
是 |
是 |
|
SO_BSDCOMPAT |
表示BSD系统兼容 |
int |
否 |
是 |
|
IPPROTO_P (IP选项) |
IP_HDRINCL |
表示在数据包中包含IP头部 |
int |
是 |
是 |
IP_OPTIONS |
表示IP头部选项 |
struct ip_options |
是 |
是 |
|
IP_RECVDSTADDR |
表示目的IP地址 |
int |
是 |
是 |
|
IP_RECVIF |
表示接收数据的网络接口 |
int |
是 |
是 |
|
IP_TOS |
表示服务类型 |
int |
是 |
是 |
|
IP_TTL |
表示服务类型 |
int |
是 |
是 |
|
IP_MULTICAST_IF |
表示发送网络接口 |
in_addr |
是 |
是 |
|
IP_MULTICAST_TTL |
表示设置发送的TTL |
uchar |
是 |
是 |
|
IP_MULTICAST_LOOP |
表示设置是否回环接口 |
uchar |
是 |
是 |
|
IP_ADD_MEMBERSHIP |
表示加入多播组 |
ip_mreq |
否 |
是 |
|
IP_DROP_MEMBERSHIP |
表示离开多播组 |
ip_mreq |
否 |
是 |
|
IPPROTO_TCP(TCP选项) |
TCP_KEEPLIVE |
表示设置保持连续时间 |
int |
是 |
是 |
TCP_MAXRT |
表示TCP最大重传时间 |
int |
是 |
是 |
|
TCP_MAXSEG |
表示TCP最大分片大小 |
int |
是 |
是 |
|
TCP_NODELAY |
表示禁止Nagle算法 |
int |
是 |
是 |
|
TCPSTDURG |
表示紧急指针 |
int |
是 |
是 |
以上好像都用不着哦
ioctl函数
原型:int ioctl(int d,int request,...);
与网络相关的主要包括对套接字、文件、网络接口、地址解析协议(ARP)和路由等的操作请求
类型 |
请求 |
含义 |
数据类型 |
IO |
SIOCATMARK |
表示是否带外数据 |
int |
SIOCSPGRP |
表示设置套接字的进程ID |
int |
|
SIOCGPGRP |
表示获得套接字的进程ID |
int |
|
FIOSETOWN |
表示设置文件所属的进程ID |
int |
|
FIOGETOWN |
表示获得文件所属的进程ID |
int |
|
SIOCGSTAMP |
表示获得时间戳 |
struct timeval |
|
文件 |
FIONBIO |
设置或取消非阻塞标记 |
int |
FIOASYNC |
表示设置或取消异步IO标记 |
int |
|
FIONREAD |
表示获得接收缓冲区内的字节数 |
int |
|
网络接口 |
SIOCGIFNAME |
表示获得网络接口名称 |
struct ifreq |
SIOCSIFLINK |
表示设置网络接口频道 |
struct ifreq |
|
SIOCGIFCONF |
表示获得网络接口列表 |
struct ifconf |
|
SIOCGIFFLAGS |
表示获得网络接口标志 |
struct ifreq |
|
SIOCSIFFLAGS |
表示设置网络接口标志 |
struct ifreq |
|
SIOCGIFADDR |
表示获得网络接口IP地址 |
struct ifreq |
|
SIOCSIFADDR |
表示设置网络接口IP地址 |
struct ifreq |
|
SIOCGIFDSTADDR |
表示获得目的地址 |
struct ifreq |
|
SIOCSIFDSTADDR |
表示设置目的地址 |
struct ifreq |
|
SIOCGIFBRDADDR |
表示获得广播的目的地址 |
struct ifreq |
|
SIOCSIFBRDADDR |
表示设置广播的目的地址 |
struct ifreq |
|
SIOCGIFNETMASK |
表示获得网络的子网掩码 |
struct ifreq |
|
SIOCSIFNETMASK |
表示设置网络的子网掩码 |
struct ifreq |
|
SIOCGIFMETRIC |
表示获得Metric |
struct ifreq |
|
SIOCSIFMETRIC |
表示设置Metric |
struct ifreq |
|
SIOCGIFMEM |
表示获得内存地址 |
struct ifreq |
|
SIOCSIFMEM |
表示设置内存地址 |
struct ifreq |
|
SIOCGIFMTU |
表示获得MTU尺寸 |
struct ifreq |
|
SIOCSIFMTU |
表示设置MTU尺寸 |
struct ifreq |
|
SIOCSIFNAME |
表示设置网络接口名称 |
struct ifreq |
|
SIOCSIFHWADDR |
表示设置硬件地址 |
struct ifreq |
|
SIOCGIFHWADDR |
表示获得硬件地址 |
struct ifreq |
|
SIOCGIFSLAVE |
表示获得驱动slave支持 |
struct ifreq |
|
SIOCSIFSLAVE |
表示设置驱动slave支持 |
struct ifreq |
|
SIOCADDMULTI |
表示获得多播地址 |
struct ifreq |
|
SIOCDELMULTI |
表示设置多播地址 |
struct ifreq |
|
SIOCGIFINDEX |
表示获得名称/网络接口映射 |
struct ifreq |
|
SIOCSIFPFLAGS |
表示设置网络标志拓展 |
struct ifreq |
|
SIOCGIFPFLAGS |
表示获得网络标志拓展 |
struct ifreq |
|
SIOCSIFHWBROADCAST |
表示设置硬件广播地址 |
struct ifreq |
|
SIOCGIFTXQLEN |
表示获得发送队列长度 |
struct ifreq |
|
SIOCSIFTXQLEN |
表示设置发送队列长度 |
struct ifreq |
|
SIOCGIFMAP |
表示获得网络设备地址映射空间 |
struct ifreq |
|
SIOCSIFMAP |
表示设置网络设备地址映射空间 |
struct ifreq |
|
ARP |
SIOCSARP |
表示设置ARP项 |
struct arpreq |
SIOCGARP |
表示获得ARP项 |
struct arpreq |
|
SIOCDARP |
表示删除ARP项 |
struct arpreq |
|
路由 |
SIOCADDRT |
表示增加路径 |
struct rtentr |
SIOCDELRT |
表示删除路径 |
struct rtentr |
ioctl()函数的IO请求
套接字IO操作的命令请求有6个,它们的第3个参数要求为一个执行整型数据的指针SIOCATMARK:查看TCP连接中是否有带外数据,如有,第3个指针的返回值为非0,否则为0
SIOCSPGRP和FIOSETOWN:可以获得对套接字的SIGIO和SIGURG信号,进行处理的进程ID或者进程组ID,通过第三个参数获得
SIOCGPGRP和FIOGETOWN:利用第3个参数,这两个请求可以设置接受此套接字的SIGIO和SIGURG信号的进程ID或进程组ID
SIOCGSTAMP:利用这个请求可以得到最后一个数据报文到达的时间,第3个参数是一个指向结构struct timeval的指针
ioctl函数的文件请求
以FIO开头,除了可以处理套接字外,对通用的文件系统也同样适用
FIONBIO:用于设置或者清除套接字的非阻塞标志,当第3参为0时清除非阻塞标志,为非0时设置为非阻塞方式
FIOASYNC:用于设置或者清除套接字的异步信号(SIGIO),当为0时清楚异步信号,非0设置异步信号
FIONREAD:用于获得当前套接字接受缓冲区中的字节数,即有多少个字节的数据可以读取
ioctl函数的网络接口请求
用到看man,就那么回事
使用ioctl对ARP高速缓存操作
struct arpreq{
struct sockaddr arp_pa; //协议地址
struct sockaddr arp_hal //硬件地址
int arp_flags; //标记
struct sockaddr arp_netmask; //协议地址的子网掩码(仅用于代理arp)
char arp_dev[16]; //查询的网络接口名称
};
标记值
ATF_COM |
查找完成的地址 |
ATF_PERM |
永久记录 |
ATF_PUBL |
发布记录 |
ATF_USETRAILERS |
使用扩展存档名称,不再使用 |
ATF_NETMASK |
使用掩码(仅用于arp代理) |
ATF_DONTPUB |
不回复 |
ATF_MAGIC |
自动添加的邻居 |
SIOCDARP:删除高速缓存中的一个记录,需要填写arp_dev和arp_pa,linux会把它的状态更新为失败(NUD_FAILED)
SIOCSADDR:设置或修改一个记录,需要填写arp_pa,arp_ha和arp_flags。如果高速缓存中已有该记录项,会进行修改,如果没有,则建立该项并设置为永久性的(ATF_PERM),除非再次手动操作,否则不会自动失效和更新
SIOCGARP:获得一个记录,需要填写arp_pa,内核会查找并返回记录。但查看高速缓存一般直接读内存映像文件/proc/net/arp(这碉堡了)
本文出自http://qianyang.blog.51cto.com/,转载请务必注明出处