Linux下 getsockopt/setsockopt 函数使用说明

getsockopt, setsockopt - 获取或设置socket套接字相关的选项

函数使用

函数原型:
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);

功能:
获取或设置文件描述符sockfd对应的套接字选项。选项可能存在于多个协议级别;它们总是存在于最高的套接字级别。在操作套接字选项时,必须指定该选项所在的级别和该选项的名称。要在套接字API级别操作选项,级别指定为SOL_SOCKET。要处理任何其他级别的选项,提供了控制该选项的适当协议的协议号。例如,为了指示一个选项是由TCP协议解释的,则应将级别设置为TCP的协议号(IPPROTO_TCP)。

头文件:
#include <sys/types.h>
#include <sys/socket.h>

参数:

  • sockfd:将要被设置或者获取选项的套接字的文件描述符。
  • level:选项所在的协议层。
  • optname:需要访问的选项名。
  • optval:对于getsockopt(),指向返回选项值的地址。对于setsockopt(),指向包含新选项值的地址。
  • optlen:对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。

返回值:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值:
EBADF:sockfd不是有效的文件描述符
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sockfd描述的不是套接字文件描述符

socket选项

根据level(SOL_SOCKET、IPPROTO_IP、IPPROTO_TCP)的不同,有对应的socket选项

1、level为SOL_SOCKET

选项名称说明数据类型
SO_BROADCAST允许发送广播数据int
SO_BSDCOMPAT与BSD系统兼容int
SO_DOMAIN获取套接字域,如AF_INET6(此选项只读)int
SO_DEBUG允许调试int
SO_DONTROUTE不经过网关,只向直接相连的主机发送数据int
SO_ERROR获得套接字错误(此选项只读)int
SO_KEEPALIVE使能发送keep_alive报文int
SO_LINGER设置或获取SO_LINGER选项struct linger
SO_OOBINLINE使能带外数据放入正常数据流int
SO_PROTOCOL获取套接字协议,如IPPROTO_SCTP(此选项只读)int
SO_RCVBUF接收缓冲区大小int
SO_SNDBUF发送缓冲区大小int
SO_RCVLOWAT接收缓冲区下限int
SO_SNDLOWAT发送缓冲区下限int
SO_RCVTIMEO接收超时struct timeval
SO_SNDTIMEO发送超时struct timeval
SO_REUSERADDR允许重用本地地址和端口int
SO_TYPE获得套接字类型(此选项只读)int

更多选项说明请见:https://linux.die.net/man/7/socket

2、level为IPPROTO_IP

选项名称说明数据类型
IP_ADD_MEMBERSHIP加入一个多播组struct ip_mreqn
IP_HDRINCL在数据包中包含IP首部int
IP_MTU获取socket的当前路径MTU(此选项只读)int
IP_OPTINOSIP首部选项int
IP_TOS服务类型
IP_TTL生存时间int

更多选项说明请见:https://linux.die.net/man/7/ip

1、level为IPPROTO_TCP

选项名称说明数据类型
TCP_INFO收集socket的信息struct tcp_info
TCP_MAXSEGTCP最大数据段的大小int
TCP_NODELAY不使用Nagle算法int
TCP_QUICKACK使能quickack模式int

更多选项说明请见:https://linux.die.net/man/7/tcp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值