setsockopt 子例程
用途
设置插座选项。
库
标准 C 库 (libc.a)
语法
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/atmsock.h> /*Needed for SOCK_CONN_DGRAM socket type
only*/ (Socket, Level, OptionName, OptionValue, OptionLength)
int Socket, Level, OptionName;
const void * OptionValue;
socklen_t OptionLength;
描述
setsockopt 子例程设置与套接字关联的选项。 选项可以存在于多个协议级别。 这些选项始终存在于最上层的套接字级别。
setsockopt 子例程为应用程序提供控制套接字通信的方法。 应用程序可以使用 setsockopt 子例程在协议级别启用调试,分配缓冲区空间,控制超时或允许套接字数据广播。 /usr/include/sys/socket.h 文件定义可用于 setsockopt 子例程的所有选项。
设置套接字选项时,请指定选项所在的协议级别以及选项的名称。
使用参数 OptionValue 和 OptionLength 来访问 setsockopt 子例程的选项值。 这些参数标识在其中返回所请求选项的值的缓冲区。
包含 setsockopt 子例程的所有应用程序都必须在 _BSD 宏设置为特定值的情况下进行编译。 可接受的值为 43 和 44。 此外,所有套接字应用程序都必须包含 BSD libbsd.a 库。
参数
| 项 | 描述 |
|---|---|
| 套接字 | 指定唯一套接字名称。 |
| 级别 | 指定选项所在的协议级别。 要在以下位置设置选项:
|
| OptionName | 指定要设置的选项。 OptionName 参数和任何指定的选项将以未解释的方式传递到相应的协议模块以进行解释。 sys/socket.h 文件定义套接字协议级别选项。 netinet/tcp.h 文件定义 TCP 协议级别选项。 可以启用或禁用套接字级别选项; 它们以切换方式运行。 以下列表定义了在 sys/socket.h 文件中找到的套接字协议级别选项:
|
| OptionName |
|
| OptionName | 以下列表定义了在 netinet/tcp.h 文件中找到的 TCP 协议级别选项:
|
| OptionName |
TCP 协议级别套接字选项从侦听套接字继承到新套接字。 以下列表定义了在 sys/atmsock.h 文件中找到的 ATM 协议级别选项:
|
| OptionName |
以下列表定义了在 netinet/sctp.h 文件中找到的 IPPROTO_TCP 协议级别选项:
|
| OptionValue | OptionValue 参数采用 Int 参数。 要启用布尔选项,请将 OptionValue 参数设置为非零值。 要禁用某个选项,请将 OptionValue 参数设置为 0。 以下选项以相同方式启用和禁用:
|
| OptionLength | OptionLength 参数包含 OptionValue 参数指向的缓冲区大小。 |
其他协议级别的选项的格式和名称各不相同。
| 项 | 描述 |
|---|---|
| IP_禁止分片 | 从现在开始为 IP 头中的每个包设置 DF 位。 为了检测路径 MTU 中的减少, UDP 应用程序使用 IP_DONTFRAG 选项。 |
| IP_查找MTU | 设置对此路径启用/禁用 PMTU 发现。 应该启用协议级别路径 MTU 发现,才能进行发现。 |
| IP_PMTU年龄 | 设置 PMTU 的年龄。 指定会话的 PMT 缩减发现频率。 将其设置为 0 (零) 意味着无限存在期,将不会尝试 PMTU 减少发现。 这将替换先前设置的 PMTU 年龄。 新的 PMTU 有效期在当前设置的计时器到期后生效。 当前未使用此选项,因为 UDP 应用程序必须设置 IP_DONTFRAG 套接字以立即检测 PMTU 中的减少。 |
| IP_TTL | 在每个包的 IP 头中设置生存时间字段。 但是,对于原始套接字,将在发送消息时使用缺省 MAXTTL 值,而不考虑使用 setsockopt 子例程设置的值。 |
| IP_HDR_INCL | 此选项允许用户构建自己的 IP 头。 它指示完整的 IP 头包含在数据中,并且只能用于原始套接字。 |
| IP_ADD_成员资格 | 连接多点广播组,如 ip_mreq 结构类型的 OptionValue 参数中所指定。 |
| IP_DROP_成员资格 | 保留 ip_mreq 结构类型的 OptionValue 参数中指定的多点广播组。 |
| ip_multicast_if | 允许在接口上发送多点广播消息,如 ip_addr 结构类型的 OptionValue 参数中所指定。 INADDR_ANY (0x000000000) 的地址将除去多点广播选项中先前选择的接口。 如果未指定接口,那么将使用指向缺省路由的接口。 |
| ip_multicast_loop | 设置多点广播回送,确定是否将传输的消息传递到发送主机。 char 类型的 OptionValue 参数控制要开启或关闭的回送。 |
| ip_multicast_ttl | 设置多点广播包的生存时间 (TTL)。 char 类型的 OptionValue 参数设置从 0 到 255 的 TTL 值。 |
| IP_block_source | 将给定源中的数据阻塞到给定组。 |
| IP_unblock_source | 取消阻塞源 (以撤销 IP_BLOCK_SOURCE 操作)。 |
| IP_ADD_SOURCE_成员资格 | 连接特定于源的多点广播组。 如果主机是组的成员,请接受来自源的数据; 否则,请加入组并接受来自给定源的数据。 |
| IP_DROP_SOURCE_成员资格 | 保留特定于源的多点广播组。 从给定的多点广播组列表中删除源。 要删除给定组的所有源,请使用 IP_DROP_MEMBERSHIP 套接字选项。 |
| 项 | 描述 | 值 | |
|---|---|---|---|
| IPPROTO_IPV6 | 将 AF_INET6 套接字限制为仅 IPv6 通信。 |
|
|
| 允许用户设置单点广播 IPv6 包的传出中继段限制。 |
|
||
| 允许用户设置多点广播 IPv6 包的传出中继段限制。 |
|
||
| 允许用户指定用于传出多点广播包的接口。 如果指定为 0 ,那么系统将选择出局接口。 |
|
||
| 如果将多点广播数据报发送到发送主机所属的组,那么 IP 层将回送该数据报的副本以进行本地传递 (如果该选项设置为 1)。 如果该选项设置为 0 ,那么不会回送副本。 |
|
||
| 在指定的本地接口上连接多点广播组。 如果将接口索引指定为 0 ,那么内核将选择本地接口。 |
|
||
| 将多点广播组保留在指定接口上。 |
|
||
| 指定内核计算原始套接字的数据和 pseudo-IPv6 头的校验和。 内核将计算出局包的校验和以及验证该套接字上的入局包的校验和。 将废弃具有不正确校验和的入局包。 缺省情况下,此选项处于禁用状态。 |
|
||
| 使入局 IPv6 包的目标 IPv6 地址和到达接口索引作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的中继段限制作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的流量类作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的路由头 (如果有) 作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的逐跳选项头 (如果有) 作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的目标选项头 (如果有) 作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 设置要在此套接字上发送的所有 IPv6 包的源 IPv6 地址和出局接口索引。 可以通过执行常规 塞索克特 ( ipi6_addr 为 in6addr_any , ipi6_ifindex 为 0) 来清除此选项。 |
|
||
| 设置此套接字上传出 IPv6 数据报的下一个中继段。 可以通过执行长度为 0 的常规 setsockopt 来清除此选项。 请注意,在这种情况下,仍必须为选项值提供内存指针。 |
|
||
| 设置此套接字上传出 IPv6 数据报的流量类。 要清除该选项,应用程序可指定-1为值。 |
|
||
| 设置要用于此套接字上的传出 IPv6 数据报的路由头。 可以通过执行长度为 0 的常规 setsockopt 来清除此选项。 请注意,在这种情况下,仍必须为选项值提供内存指针。 |
|
||
| 设置要用于此套接字上的传出 IPv6 数据报的逐跳选项头。 可以通过执行长度为 0 的常规 setsockopt 来清除此选项。 请注意,在这种情况下,仍必须为选项值提供内存指针。 |
|
||
| 设置要用于此套接字上的传出 IPv6 数据报的目标选项头。 此头将跟在路由头之后 (如果存在) ,并且在未指定路由头时也将使用此头。 可以通过执行长度为 0 的常规 setsockopt 来清除此选项。 请注意,在这种情况下,仍必须为选项值提供内存指针。 |
|
||
| 设置要用于此套接字上的传出 IPv6 数据报的目标选项头。 此头将在路由头之前 (如果存在)。 如果未指定路由头,那么将以静默方式忽略此选项。 可以通过执行长度为 0 的常规 setsockopt 来清除此选项。 请注意,在这种情况下,仍必须为选项值提供内存指针。 |
|
||
| 设置此选项以控制 IPv6 路径 MTU 发现。 |
|
||
| 设置此选项可防止此套接字上传出 IPv6 包的分段。 如果正在发送的包大于出局接口 MTU ,那么将废弃该包。 |
|
||
| 通过设置此选项来启用 IPV6_PATHMTU 辅助数据项的接收。 |
|
||
| 设置此套接字的地址选择首选项。 |
|
||
| 连接多点广播组,如 group_req 结构的 OptionValue 参数中所指定。 如果指定的接口索引为 0 ,那么内核将选择缺省接口。 |
|
||
| 保留 group_req 结构的 OptionValue 参数中指定的多点广播组。 |
|
||
| 将指定源中的数据阻塞到指定的多点广播组。 |
|
||
| 将数据从指定的源取消阻塞到指定的多点广播组。 此选项用于撤销 MCAST_BLOCK_SOURCE 操作。 |
|
||
| 连接特定于源的多点广播组。 如果主机已经是组的成员,请接受来自指定源的数据; 否则,请加入组并接受来自指定源的数据。 |
|
||
| 保留特定于源的多点广播组。 从指定的多点广播组中保留指定的源。 要保留多点广播组的所有源,请使用 IPV6_LEAVE_GROUP 或 MCAST_LEAVE_GROUP 套接字选项。 |
|
||
| 项 | 描述 | 值 |
|---|---|---|
| IPPROTO_ICMPV6 | 允许用户按 ICMPV6 类型字段过滤 ICMPV6 消息。 要清除现有过滤器,请发出长度为零的 setsockopt 调用。 |
|
tcp.h:#define TCP_ACLFLUSH 0x21 /* clear all DACinet ACLs */
tcp.h:#define TCP_ACLCLEAR 0x22 /* clear DACinet ACL */
tcp.h:#define TCP_ACLADD 0x23 /* Add to DACinet ACL */
tcp.h:#define TCP_ACLDEL 0x24 /* Delete from DACinet ACL */
tcp.h:#define TCP_ACLLS 0x25 /* List DACinet ACL */
tcp.h:#define TCP_ACLBIND 0x26 /* Set port number for TCP_ACLLS */
tcp.h:#define TCP_ACLGID 0x01 /* ID being added to ACL is a GID */
tcp.h:#define TCP_ACLUID 0x02 /* ID being added to ACL is a GID */
tcp.h:#define TCP_ACLSUBNET 0x04 /* address being added to ACL is a subnet */
tcp.h:#define TCP_ACLDENY 0x08 /* this ACL entry is for denying access */返回值
成功完成后,将返回值 0。
如果 setsockopt 子例程不成功,那么子例程处理程序将执行以下函数:
- 向调用程序返回-1。
- 将指示特定错误的错误代码移动到 errno 全局变量中。
错误代码
| 项 | 描述 |
|---|---|
| EBADF | Socket 参数无效。 |
| Efault | Address 参数不在用户地址空间的可写部分中。 |
| EINVAL | OptionValue 参数或 OptionLength 参数无效或套接字已关闭。 |
| ENOBUFS | 内存不足,无法用于内部数据结构。 |
| ENOTSOCK | Socket 参数引用文件,而不是套接字。 |
| ENOPROTOOPT | 选项未知。 |
| EOPNOTSUPP | 该选项不受套接字系列或套接字类型支持。 |
| EPERM | 用户应用程序无权获取或设置此套接字选项。 检查网络可调参数选项 |
示例
- 要标记用于广播的套接字:
int on=1; setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); - 要开启 TCP_NODELAYACK 选项,请运行以下命令:
int on=1; setsockopt(s, IPPROTO_TCP, TCP_NODELAYACK, &on, sizeof(on));