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*/
int setsockopt ( 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 子程序的选项值。 和 OptionValue 和 OptionLength 参数标识了一个缓冲区,在该缓冲区中将返回所请求选项的值或。
在编译包含 setsockopt 子程序的应用程序时,必须将 _BSD 宏设置为特定值。 可接受的数值是 43 和 44。 此外,所有套接字应用程序都必须包含 Berkeley Software Distribution (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 文件中可用的
|
| OptionValue | 该 OptionValue 参数取一个 Int 参数。 要启用布尔选项,必须将 OptionValue 参数设置为非零值。 要禁用布尔选项,请将 OptionValue 参数设置为 0。 以下选项的启用和禁用方式相同:
|
| OptionLength | 参数 OptionLength 参数所指向的缓冲区的大小。 OptionValue 参数指向的缓冲区大小。 |
其他协议级别的选项的格式和名称各不相同。
| 项 | 描述 |
|---|---|
| IP_DONTFRAG | 从现在开始为 IP 头中的每个包设置 DF 位。 使用 IP_DONTFRAG 选项检测 UDP 应用程序中路径 MTU (PMTU) 的减少。 |
| IP_FINDPMTU | 设置启用或禁用此路径的 PMTU 发现。 启用 MTU 发现的协议级路径,以便进行发现。 |
| IP_PMTUAGE | 设置 PMTU 的年龄。 指定会话 PMT 恢复的频率。 将 PMTU 年龄设为 0 意味着无限年龄,不会尝试发现 PMTU 减少,并取代先前设置的 PMTU 年龄。 新的 PMTU 有效期在当前设置的计时器到期后生效。 该选项未被使用,因为 UDP 应用程序必须设置 IP_DONTFRAG 套接字才能立即检测到 PMTU 的下降。 |
| IP_TTL | 为每个数据包设置 IP 报头中的生存时间 (TTL) 字段。 但是,对于原始套接字,无论使用 setsockopt 子程序设置了多少值,在发送报文时都会使用默认的 MAXTTL 值。 |
| IP_HDRINCL | 允许您创建自己的 IP 标头。 它指示完整的 IP 头包含在数据中,并且只能用于原始套接字。 |
| IP_ADD_成员资格 | 加入一个组播组,该组播组在 OptionValueip_mreq 参数中指定的多播组。 |
| IP_DROP_成员资格 | 结构类型中指定的组播组。 OptionValueip_mreq 参数中指定的多播组。 |
| ip_multicast_if | 允许在一个接口上发送组播信息,该接口在 OptionValueip_addr 参数中指定的接口上发送多播信息。 INADDR_ANY ( 0x000000000 ) 的地址会删除先前在组播选项中对接口的选择。 如果未指定接口,则使用通向默认路由的接口。 |
| ip_multicast_loop | 设置组播环回,决定传输的信息是否会被传送到发送主机。 一个 OptionValuechar 类型的参数控制环回的开启或关闭。 |
| ip_multicast_ttl | 设置组播数据包的 TTL。 一个 OptionValuechar 类型的参数设置的 TTL 值范围为 0 至 255。 |
| IP_block_source | 阻止数据从给定源发送到给定组。 |
| IP_unblock_source | 解除屏蔽源,以撤销 IP_BLOCK_SOURCE 操作。 |
| IP_ADD_SOURCE_成员资格 | 连接特定于源的多点广播组。 如果主机是组的成员,则接受来自源的数据。 否则,加入该组并接受来自给定来源的数据。 |
| IP_DROP_SOURCE_成员资格 | 保留特定于源的多点广播组。 从给定的多点广播组列表中删除源。 要删除指定组中的所有源,必须使用 IP_DROP_MEMBERSHIP socket 选项。 |
| 项 | 描述 | 值 | |
|---|---|---|---|
| IPPROTO_IPV6 | 限制 AF_INET6 插座只能用于 IPv6 通信。 |
|
|
| 允许您设置单播 IPv6 数据包的传出跳数限制。 |
|
||
| 允许您设置组播 IPv6 数据包的传出跳数限制。 |
|
||
| 允许您指定用于传出组播数据包的接口。 如果指定为 0 ,系统将选择传出接口。 |
|
||
| 如果组播数据报被发送到发送主机所属的组,那么在选项设置为 1 的情况下,该数据报的副本会被 IP 层环回以进行本地传送。 如果该选项设置为 0 ,则副本不会循环返回。 |
|
||
| 在指定的本地接口上连接多点广播组。 如果接口索引指定为 0 ,内核将选择本地接口。 |
|
||
| 将多点广播组保留在指定接口上。 |
|
||
| 指定内核对原始套接字的数据和 pseudo-IPv6 标头计算校验和。 内核会计算传出数据包的校验和,并验证该套接字上传入数据包的校验和。 校验和不正确的传入数据包将被丢弃。 缺省情况下,此选项处于禁用状态。 |
|
||
| 使入局 IPv6 包的目标 IPv6 地址和到达接口索引作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的中继段限制作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使入局 IPv6 包的流量类作为 UDP 和原始套接字上的辅助数据接收。 |
|
||
| 使传入 IPv6 数据包的路由标头作为 UDP 和原始套接字的辅助数据接收。 |
|
||
| 使传入 IPv6 数据包的逐跳选项标头作为 UDP 和原始套接字的辅助数据接收。 |
|
||
| 使传入 IPv6 数据包的目标选项头作为 UDP 和原始套接字的辅助数据接收。 |
|
||
| 为该套接字发送的所有 IPv6 数据包设置源 IPv6 地址和传出接口索引。 您可以通过常规的 setsockopt 清除该选项。 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 辅助数据项。 |
|
||
| 设置此套接字的地址选择首选项。 |
|
||
加入 结构的参数中指定的组播组。 OptionValuegroup_req 参数中指定的多播组。 如果指定的接口索引为 0 ,内核将选择默认接口。 |
|
||
离开 结构参数中指定的组播组。 OptionValuegroup_req 参数中指定的组播组。 |
|
||
| 将指定源中的数据阻塞到指定的多点广播组。 |
|
||
| 将数据从指定的源取消阻塞到指定的多点广播组。 此选项用于撤销 MCAST_BLOCK_SOURCE 操作。 |
|
||
| 连接特定于源的多点广播组。 如果主机已经是组的成员,则接受来自指定来源的数据。 否则,加入该组并接受来自指定来源的数据。 |
|
||
| 保留特定于源的多点广播组。 从指定的多点广播组中保留指定的源。 要离开组播组的所有来源,必须使用 IPV6_LEAVE_GROUP 或 MCAST_LEAVE_GROUP 套接字选项。 |
|
||
| 项 | 描述 | 值 |
|---|---|---|
| IPPROTO_ICMPV6 | 通过 ICMPV6 类型字段过滤 ICMPV6 邮件。 发出长度为零的 setsockopt 调用,清除现有过滤器。 |
|
dacinet 功能。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 | 地址参数不在用户地址空间的可写部分。 |
| EINVAL | 参数或 OptionValue 参数或 OptionLength 参数无效或套接字已关闭。 |
| ENOBUFS | 内部数据结构内存不足。 |
| ENOTSOCK | Socket 参数指的是文件,而不是套接字。 |
| ENOPROTOOPT | 选项未知。 |
| EOPNOTSUPP | 套接字系列或套接字类型不支持 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));