套接字选项

套接字选项,超高级货,赛车的按钮盘


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/,转载请务必注明出处

你可能感兴趣的:(c,linux,IO)