套接字选项

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

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

时间: 2024-10-27 18:16:21

套接字选项的相关文章

SO_REUSEADDR 套接字选项应用实例

网络上关于SO_REUSEADDR套接字选项用来解决地址重用问题的资料不少,但只停留在文字表达上,并没有实例,很容易误导初学者,并产生疑惑,此处不再赘述.下面通过一个简短的例子来展示如何在项目中合理的使用该选项,以及需要注意的问题. 关于TCP断开连接四次握手,如图所示 应用场景: 之前项目中遇到一个问题,聊天服务器的开启,关闭和重启,例如将服务器关闭后,实际上关闭了服务器的监听套接字(close),如果此时用户点击开启服务器,那么用户希望的情况是服务器又立即启动了.而由于close后,执行了主

sockets: 套接字选项相关的系统调用

########################################################### 套接字选项相关的系统调用: ########################################################### 将optval指向的单元中的值设置给optname选项: int setsockopt(int sockfd, int level, int optname, const void *optval,socklen_t optlen)

linux程序设计——套接字选项(第十五章)

现在可以改进客户程序,使它可以连接到任何有名字的主机,这次不是连接到示例服务器,而是连接到一个标准服务,这样就可以演示端口号的提取操作了. 大多数UNIX和一些linux系统都有一项标准服务daytime,它提供系统的日期和时间.客户可以连接到这个服务来查看服务器的当前日期和时间.下面就是完成这一工作的客户程序getdate.c 编写程序getdate.c /*********************************************************************

第7章套接字选项

一般通过以下函数设置套接字选项:getsockopt和setsockopt函数;fcntl函数;ioctl函数 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, i

UNIX网络编程——套接字选项

http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

socket套接字选项

socket.setsockopt(level, optname, value) ↑ ↑ ↑ →[SO_KEEPALIVE ,   ↑  SO_LINGER , ↑   SO_RCVBUF , ↑    SO_SNDBUF , ↑       SO_RCVLOWAT ,SO_SNDLOWAT , ↑    SO_RCVTIMEO , SO_SNDTIMEO, ↑  SO_REUSEADDR] 按照参数选项级别level值的不同   套接字选项分为3大类 1.通用套接字选项:SOL_SOCKET

Unix网络编程学习笔记之第7章 套接字选项

一.获取/设置套接字选项的方法 一个套接字描述符相关联的套接字选项很多.获取/设置套接字选项的方法: 1.  getsockopt和setsockopt函数 2. fcntl函数 3. ioctl函数 二. getsockopt和setsockopt函数 int getsockopt(int sockfd, int level, int optname, void* optval, socklen_t* optlen); int setsockopt(int sockfd, int level,

UNIX网络编程——套接字选项(心跳检测、绑定地址复用)(转)

/* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( int iSockfd , int iSockAttrOn, socklen_t iIdleTime , socklen_t iInterval , socklen_t iCount ){ setsockopt( iSockfd , SOL_SOCKET , SO_KEEPALIVE , (const

apue和unp的学习之旅09——套接字选项

//-----------------------------------1.getsockopt和setsockopt-------------------------------------- #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void* optval, socklen_t* optlen); int setsockopt(int sockfd, int level, int