getsockopt和setsockopt函数

原文地址 getsockopt和setsockopt函数

在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项。

getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。

#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
 /*
sockfd:一个标识套接口的描述字。
level:选项定义的层次。例如,支持的层次有SOL_SOCKET、IPPROTO_TCP等。
optname:需获取的套接口选项。
optval:指针,指向存放所获得选项值的缓冲区。
optlen:指针,指向optval缓冲区的长度值。
*/

setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。

#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
/*
sockfd:标识一个套接口的描述字。
level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6等。
optname:需设置的选项。
optval:指针,指向存放选项值的缓冲区。
optlen:optval缓冲区长度。
*/

以上两个函数仅用于套接口,sockfd必须指向一个打开的套接口, level指定系统中解释选项的代码,普通套接口代码或特定于协议的代码(例如:IPv4、IPv6或TCP)。

optval是一个指向变量的指针,通过它,或由setsockopt取得选项的新值,或由getsockopt存储选项的当前值。此变量的大小由最后一个参数指定,对于setsockopt,它是一个值,对getsockopt来说,它是一个出参。

下表总结了由getsockopt获取或由setsockopt设置的一些选项,“数据类型”列给出了指针optval必须指向的每个选项的数据类型。其中,用花括号的标记来表示一个结构,如linger{}表示结构linger。

level级别:SOL_SOCKET
optname选项值数据类型访问说明
SO_ACCEPTCONNboolget如为TRUE(真) ,表明套接字处于监听模式
SO_BROADCASTboolget/set如TRUE,表明套接字已配置成对广播消息进行发送
SO_CONNECT_TIMEintget返回套接字建立连接的时间,以秒为单位,如尚未连接,返回0xffffffff
SO_DEBUGboolget/set如果TRUE,就允许调试输出 (W32不支持)
SO_DONTLINGERboolget/set如果是TRUE,则禁用SO_LINGER
SO_LINGERstruct lingerget/set设置或获取当前的拖延值
SO_DONTROUTEboolget/set如果TRUE,便直接向网络接口发送消息,毋需查询路由表
SO_ERRORboolget返回错误状态
SO_EXCLUSIVEADDRUSEboolget/set如果TRUE,套接字绑定那个本地端口就不能重新被另一个进程使用
SO_KEEPALIVEboolget/set如果TRUE,套接字就会进行配置,在会话过程中发送”保持活动”消息
SO_MAX_MSG_SIZEunsigned intget对一个面向消息的套接字来说,一条消息的最大长度
SO_OOBINLINEboolget/set如果是TRUE,带外数据就会在普通数据流中返回 (W32不支持)
SO_PROTOCOL_INFOWSAPROTOCOL_INFOget套接字绑定的那种协议的特征
SO_RCVBUFintget/set面向接收操作,为每个套接字分别获取或设置缓冲区长度
SO_REUSEADDRboolget/set如果是TRUE,套接字就可与一个正由其他套接字使用的地址绑定到一起,或与处在TIME_WAIT状态的地址绑定到一起
SO_SNDBUFboolget/set设置分配给套接字的数据发送缓冲区的大小
SO_TYPEintget返回指定套接字的类型(如SOCK_DGRAM和SOCK_STREAM等等)
SO_SNDTIMEOintget/set获取或设置套接字上的数据发送超时时间(以毫秒为单位)
SO_RCVTIMEOintget/set获取或设置与套接字上数据接收对应的超时时间值(以毫秒为单位)
SO_UPDATE_ACCEPT_CONTEXTSOCKETget/set更新SOCKET状态
level级别:IPPROTO_IP
optname(选项名)选项值数据类型访问说明
IP_OPTIONSchar[]get/set设置或获取IP头内的IP选项
IP_HDRINCLboolget/set如果是TRUE,IP头就会随即将发送的数据一起提交,并从读取的数据中返回
IP_TOSintget/setIP服务类型
IP_TTLintget/setIP协议的“存在时间” (TTL)
IP_MULTICAST_IFunsigned longget/set获取或设置打算从它上面发出多播数据的本地接口
IP_MULTICAST_TTLintget/set为套接字获取或设置多播数据包的存在时间
IP_MULTICAST_LOOPboolget/set如果TRUE,发至多播地址的数据将原封不动地“反射”或“反弹”回套接字的进入缓冲区
IP_ADD_MEMBERSHIPstruct ip_mreqset在指定的IP组内为套接字赋予成员资格
IP_DROP_MEMBERSHIPstruct ip_mreqset将套接字从指定的IP组内删去(撤消成员资格)
IP_DONTFRAGMENTboolget/set如果是TRUE,就不对IP数据报进行分段
level级别:IPPROTO_TCP
optname(选项名)选项值数据类型访问说明
TCP_NODELAYboolget/set若为TRUE, 就会在套接字上禁用Nagle算法 (只适用于流式套接字)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: getsockopt/setsockopt函数是用于设置和获取套接字选项的函数。其中,getsockopt用于获取指定套接字选项的值,而setsockopt用于设置指定套接字选项的值。这两个函数在网络编程中经常被用到。 ### 回答2: getsockoptsetsockopt函数是用来获取和设置套接字选项的API函数,在网络编程中十分常见。套接字选项是一个可选的参数,它允许用户设置套接字的某些属性,例如超时时间、是否启用广播、缓冲区大小等等。 getsockopt函数用于获取套接字选项的当前值。它需要传入以下参数: 1. sockfd: 套接字描述符; 2. level: 选项定义的协议层; 3. optname: 需要获取的选项名称; 4. optval: 指向一个缓冲区,用于存储获取到的选项值; 5. optlen: 缓冲区的大小。 setsockopt函数用于设置套接字选项的值。它需要传入以下参数: 1. sockfd: 套接字描述符; 2. level: 选项定义的协议层; 3. optname: 需要设置的选项名称; 4. optval: 指向一个缓冲区,用于存储需要设置的选项值; 5. optlen: 缓冲区的大小。 需要注意的是,不同的协议层和选项名称对应的值有所不同。可以通过man手册或者网络查找相关资料来获取更详细的信息。 这些函数在网络编程中经常被使用,例如可以通过setsockopt函数设置套接字的超时时间,当网络I/O操作超过指定时间时,会自动返回一个超时错误;也可以通过getsockopt函数来获取当前是否启用了广播选项等等。 总之,getsockoptsetsockopt函数可以让我们更方便地控制和监控套接字的行为,提高网络通信的效率和可靠性。 ### 回答3: getsockoptsetsockopt函数都是与网络编程相关的系统调用函数,它们用于控制和获取套接字选项。在进行网络编程时,我们需要使用这两个函数来调整套接字的设置,以便实现更好的网络通信效果。 具体地说,setsockopt函数可以设置某个套接字的选项值,例如设置套接字的发送和接收缓冲区大小、设置是否对数据包进行分片等等。而getsockopt函数则可以获取某个套接字的选项值,以便进行校验或者输出日志等功能。 关于参数方面,getsockoptsetsockopt函数都需要传入当前操作的套接字句柄,以及要设置或者获取的选项值。setsockopt函数还需要传入对应选项值的指针和大小;而getsockopt函数需要传入一个指向缓冲区的指针,用来接收获取的选项值和大小。 需要注意的是,每个选项都有对应的协议层级,而不同的选项可能只在特定协议的套接字上有效。因此,在使用这两个函数时,需要注意选项的协议层级,以及操作的套接字所使用的协议类型,避免出现无法设置或获取选项值的情况。 同时,getsockoptsetsockopt函数也有一定的返回值,setsockopt函数返回是否设置成功,而getsockopt函数返回获取的选项值的长度。在使用时,我们需要对返回值进行判断,以便及时发现并解决问题。 总之,getsockoptsetsockopt函数是网络编程中必不可少的函数。它们用于设置和获取套接字的选项值,以便我们能够更加精细地控制网络通信的行为,从而提高网络通信效率和质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值