下表描述了 SOL_SOCKET 套接字选项。 有关获取和设置套接字选项的更多信息,请参阅 getsockopt 和 setsockopt 函数参考页。
要枚举协议并发现每个已安装协议的支持属性,请使用 WSAEnumProtocols、WSCEnumProtocols 或 WSCEnumProtocols32 函数。
某些套接字选项需要的说明非这些表所能传达;此类选项包含指向其他页面的链接。
注释
所有 SOL_SOCKET 套接字选项都同样适用于 IPv4 和 IPv6(除非SO_BROADCAST,因为 IPv6 中未实现广播)。
SOL_SOCKET套接字选项
| 选项 | 获取 | 设置 | Optval 类型 | Description |
|---|---|---|---|---|
| PVD_CONFIG | 是的 | 是的 | char [] | 包含服务提供商的配置信息的不透明数据结构对象。 此选项依赖于实现。 |
| SO_ACCEPTCONN | 是的 | DWORD(布尔值) | 返回套接字是否处于侦听模式。 此选项仅适用于面向连接的协议。 | |
| SO_BROADCAST | 是的 | 是的 | DWORD(布尔值) | 配置用于发送广播数据的套接字。 此选项仅适用于支持广播的协议(例如 IPX 和 UDP)。 |
| SO_BSP_STATE | 是的 | CSADDR_INFO | 返回套接字使用的本地地址、本地端口、远程地址、远程端口、套接字类型和协议。 有关详细信息 ,请参阅SO_BSP_STATE 参考。 | |
| SO_CONDITIONAL_ACCEPT | 是的 | 是的 | DWORD(布尔值) | 指示应用程序是否接受或拒绝传入连接,而不是由协议堆栈接受或拒绝。 有关详细信息,请参阅 SO_CONDITIONAL_ACCEPT 参考。 |
| SO_CONNDATA | 是的 | 是的 | char [] | 其他数据(不在普通网络数据流中)与网络请求一起发送以建立连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 |
| SO_CONNDATALEN | 是的 | DWORD | 与网络请求一起发送的其他数据的长度(以字节为单位)而不是在正常网络数据流中发送,以建立连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 | |
| SO_CONNECT_TIME | 是的 | DWORD | 返回已连接套接字的秒数。 此选项仅适用于面向连接的协议。 | |
| SO_CONNOPT | 是的 | 是的 | char [] | 其他连接选项数据(不在普通网络数据流中)与网络请求一起发送以建立连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 |
| SO_CONNOPTLEN | 是的 | DWORD | 连接选项数据的长度(以字节为单位)而不是正常网络数据流中,该数据流随网络请求一起发送以建立连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 | |
| SO_DISCDATA | 是的 | 是的 | char [] | 其他数据(不在正常的网络数据流中)发送,并发送网络请求以断开连接连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 |
| SO_DISCDATALEN | 是的 | DWORD | 与网络请求一起发送的其他数据的长度(以字节为单位)而不是在正常网络数据流中发送,以断开连接连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 | |
| SO_DISCOPT | 是的 | 是的 | char [] | 其他断开连接选项数据(不在正常的网络数据流中)与网络请求一起发送以断开连接连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 |
| SO_DISCOPTLEN | 是的 | DWORD | 其他断开连接选项数据的长度(以字节为单位)而不是常规网络数据流中,该数据流随网络请求一起发送,以断开连接的连接。 此选项由旧协议(如 DECNet、OSI TP4 等)使用。 Windows中的 TCP/IP 协议不支持此选项。 | |
| SO_DEBUG | 是的 | 是的 | DWORD(布尔值) | 启用调试输出。 Microsoft提供程序当前不输出任何调试信息。 |
| SO_DONTLINGER | 是的 | 是的 | DWORD(布尔值) | 指示与套接字关联的徘徊结构l_onoff成员的状态。 如果此成员为非零,在 closesocket 函数调用后,套接字将保持打开状态,以便发送排队的数据。 此选项仅适用于可靠且面向连接的协议。 |
| SO_DONTROUTE | 是的 | 是的 | DWORD(布尔值) | 指示应在套接字绑定到的任何接口上发送传出数据,而不是在其他接口上路由。 此选项仅适用于面向消息的协议。 Microsoft提供程序以无提示方式忽略此选项,并始终咨询路由表以查找适当的传出接口。 |
| SO_ERROR | 是的 | DWORD | 返回此套接字上的最后一个错误代码。 此每套接字错误代码并不总是立即设置。 | |
| SO_EXCLUSIVEADDRUSE | 是的 | 是的 | DWORD(布尔值) | 阻止任何其他套接字绑定到同一地址和端口。 在调用 绑定 函数之前,必须设置此选项。 有关详细信息,请参阅 SO_EXCLUSIVEADDRUSE 参考。 |
| SO_GROUP_ID | 是的 | 无符号整数 | 此套接字选项是保留的,不应使用。 | |
| SO_GROUP_PRIORITY | 是的 | 是的 | int | 此套接字选项是保留的,不应使用。 |
| SO_KEEPALIVE | 是的 | 是的 | DWORD(布尔值) | 为套接字连接启用保持活动状态。 仅适用于支持保持连接(面向连接的协议)概念的协议。 对于 TCP,默认保持连接超时为 2 小时,保持连接间隔为 1 秒。 保持活动探测的默认数目因Windows版本而异。 有关详细信息,请参阅 SO_KEEPALIVE 参考。 |
| SO_LINGER | 是的 | 是的 | 结构挥之不去 | 指示与套接字关联的 徘徊 结构的状态。 如果linger 结构的l_onoff成员为非零,则关闭的函数调用后,套接字将保持打开状态,以启用要发送的排队数据。 在徘徊结构l_linger成员中指定保持打开的时间(以秒为单位)。 此选项仅适用于可靠且面向连接的协议。 |
| SO_MAX_MSG_SIZE | 是的 | DWORD | 返回协议支持的面向消息的套接字的最大出站消息大小。 对于面向流的套接字没有任何意义。 | |
| SO_MAXDG | 是的 | DWORD | 返回协议支持的出站数据报的最大大小(以字节为单位)。 此套接字选项对面向流的套接字没有意义。 | |
| SO_MAXPATHDG | 是的 | DWORD | 将协议支持的出站数据报的最大大小(以字节为单位)返回到给定的目标地址。 此套接字选项对面向流的套接字没有意义。 Microsoft提供程序可能会以无提示方式将此视为SO_MAXDG。 | |
| SO_OOBINLINE | 是的 | 是的 | DWORD(布尔值) | 指示应随常规数据一起返回超出边界的数据。 此选项仅适用于支持带外数据的面向连接的协议。 |
| SO_OPENTYPE | 是的 | 是的 | DWORD | 设置后,会影响创建的后续套接字是否不重叠。 此选项的可能值为SO_SYNCHRONOUS_ALERT和SO_SYNCHRONOUS_NONALERT。 不应使用此选项。 请改用 WSASocket 函数,并将 dwFlags 参数中的WSA_FLAG_OVERLAPPED位保持关闭状态。 |
| SO_PAUSE_ACCEPT | 是的 | 是的 | DWORD(布尔值) | 使用此选项侦听套接字。 设置 选项后,套接字将使用 RST 响应所有传入连接,而不是接受它们。 |
| SO_PORT_SCALABILITY | 是的 | 是的 | DWORD(布尔值) | 通过允许通过为本地计算机上的不同本地地址端口对分配通配符端口多次来最大化套接字的本地端口可伸缩性,从而启用套接字的本地端口可伸缩性。 在两个选项可用的平台上,首选SO_REUSE_UNICASTPORT而不是此选项。 有关详细信息,请参阅 SO_PORT_SCALABILITY 参考。 |
| SO_PROTOCOL_INFO | 是的 | WSAPROTOCOL_INFO | 如果定义了 UNICODE 宏,则此选项将定义为SO_PROTOCOL_INFOW套接字选项。 如果未定义 UNICODE 宏,则此选项将定义为SO_PROTOCOL_INFOA套接字选项。 | |
| SO_PROTOCOL_INFOA | 是的 | WSAPROTOCOL_INFOA | 返回给定套接字的 WSAPROTOCOL_INFOA 结构 | |
| SO_PROTOCOL_INFOW | 是的 | WSAPROTOCOL_INFOW | 返回给定套接字的 WSAPROTOCOL_INFOW 结构 | |
| SO_RANDOMIZE_PORT | 是的 | 是的 | DWORD(布尔值) | 应在未绑定套接字上设置此选项。 设置SO_RANDOMIZE_PORT并在套接字上选择临时端口时,将绑定随机端口号。 自动重用端口(使用SO_REUSE_UNICASTPORT选择的端口)也会随机化返回的端口,因此,如果应用程序设置SO_REUSE_UNICASTPORT,然后尝试设置SO_RANDOMIZE_PORT,则第二个 setsockopt 调用将失败。 |
| SO_RCVBUF | 是的 | 是的 | DWORD | 为接收保留的每套接字缓冲区空间总数。 这与SO_MAX_MSG_SIZE无关,不一定对应于 TCP 接收窗口的大小。 |
| SO_RCVLOWAT | 是的 | 是的 | DWORD | 包括 BSD UNIX 中的套接字选项,以实现向后兼容性。 此选项设置套接字输入作要处理的最小字节数。 Windows TCP/IP 提供程序不支持此选项。 如果在 Windows Vista 及更高版本上使用此选项,则 getsockopt 和 setsockopt 函数会失败并显示 WSAEINVAL。 在早期版本的 Windows 上,这些函数失败并显示 WSAENOPROTOOPT。 |
| SO_RCVTIMEO | 是的 | 是的 | DWORD | 阻止接收调用的超时(以毫秒为单位)。 此选项的默认值为零,指示接收操作不会超时。如果阻塞接收呼叫超时,则连接处于不确定状态,应关闭。 如果使用 WSASocket 函数创建套接字, dwFlags 参数必须设置WSA_FLAG_OVERLAPPED属性才能使超时正常工作。 否则,超时永远不会生效。 |
| SO_REUSEADDR | 是的 | 是的 | DWORD(布尔值) | 允许套接字绑定到已使用的地址和端口。 SO_EXCLUSIVEADDRUSE选项可以阻止此操作。 |
| SO_REUSE_UNICASTPORT | 是的 | 是的 | DWORD(布尔值) | 设置后,允许对需要显式绑定(如 ConnectEx)的 Winsock API 连接函数重复使用临时端口。 请注意,具有隐式绑定的连接函数(如没有显式绑定的连接)默认设置了此选项。 使用此选项,而不是在两者都可用的平台上 SO_PORT_SCALABILITY 。 |
| SO_REUSE_MULTICASTPORT | 是的 | DWORD | 在套接字上设置时,此选项指示该套接字永远不会用于接收单播数据包,因此其端口可以与其他仅多播应用程序共享。 将值设置为 1 可始终在端口上共享多播流量。 将值设置为 0(默认值)将禁用此行为。 | |
| SO_SNDBUF | 是的 | 是的 | DWORD | 为发送保留的每套接字缓冲区空间总数。 这与SO_MAX_MSG_SIZE无关,不一定对应于 TCP 发送窗口的大小。 |
| SO_SNDLOWAT | 是的 | 是的 | DWORD | 包括 BSD UNIX 中的套接字选项,以实现向后兼容性。 此选项设置套接字输出作要处理的最小字节数。 Windows TCP/IP 提供程序不支持此选项。 如果在 Windows Vista 及更高版本上使用此选项,则 getsockopt 和 setsockopt 函数会失败并显示 WSAEINVAL。 在早期版本的 Windows 上,这些函数失败并显示 WSAENOPROTOOPT。 |
| SO_SNDTIMEO | 是的 | 是的 | DWORD | 阻止发送调用的超时(以毫秒为单位)。 此选项的默认值为零,指示发送操作不会超时。如果阻塞发送调用超时,则连接处于不确定状态,应关闭。 如果使用 WSASocket 函数创建套接字, dwFlags 参数必须设置WSA_FLAG_OVERLAPPED属性才能使超时正常工作。 否则,超时永远不会生效。 |
| SO_TYPE | 是的 | DWORD | 返回给定套接字的套接字类型(例如,SOCK_STREAM或SOCK_DGRAM)。 | |
| SO_UPDATE_ACCEPT_CONTEXT | 是的 | DWORD(布尔值) | 此选项与 AcceptEx 函数一起使用。 此选项更新从侦听套接字继承的套接字的属性。 如果要在接受的套接字上使用 getpeername、getockname、getockopt 或 setsockopt 函数,则应设置此选项。 | |
| SO_UPDATE_CONNECT_CONTEXT | 是的 | DWORD(布尔值) | 此选项用于 ConnectEx、 WSAConnectByList 和 WSAConnectByName 函数。 此选项在建立连接后更新套接字的属性。 如果要在连接的套接字上使用 getpeername、getockname、getockopt、setockopt 或关闭函数,则应设置此选项。 | |
| SO_USELOOPBACK | 是的 | 是的 | DWORD(布尔值) | 从此套接字发送数据时,请使用本地环回地址。 仅当发送的所有数据也将在本地接收时,才应使用此选项。 Windows TCP/IP 提供程序不支持此选项。 如果在 Windows Vista 及更高版本上使用此选项,则 getsockopt 和 setsockopt 函数会失败并显示 WSAEINVAL。 在早期版本的 Windows 上,这些函数失败并显示 WSAENOPROTOOPT。 |
Windows对SOL_SOCKET选项的支持
| 选项 | Windows 10操作系统 | Windows 7 | Windows Server 2008 | Windows Vista | Windows Server 2003 | Windows XP | Windows 2000 | Windows NT4 | Windows 9x/ME |
|---|---|---|---|---|---|---|---|---|---|
| PVD_CONFIG | |||||||||
| SO_ACCEPTCONN | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_BROADCAST | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_BSP_STATE | 是的 | 是的 | 是的 | 是的 | |||||
| SO_CONDITIONAL_ACCEPT | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | ||
| SO_CONNDATA | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_CONNDATALEN | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_CONNECT_TIME | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_CONNOPT | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_CONNOPTLEN | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_DISCDATA | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_DISCDATALEN | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_DISCOPT | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_DISCOPTLEN | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_DEBUG | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_DONTLINGER | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_DONTROUTE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_ERROR | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_EXCLUSIVEADDRUSE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是 SP4+ | |
| SO_GROUP_ID | 是的 | 是的 | 是的 | 是的 | |||||
| SO_GROUP_PRIORITY | 是的 | 是的 | 是的 | 是的 | |||||
| SO_KEEPALIVE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_LINGER | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_MAX_MSG_SIZE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_MAXDG | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | ||
| SO_MAXPATHDG | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | ||
| SO_OOBINLINE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_OPENTYPE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_PORT_SCALABILITY | 是的 | 是的 | 是的 | ||||||
| SO_PROTECT | 是的 | ||||||||
| SO_PROTOCOL_INFO | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_PROTOCOL_INFOA | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_PROTOCOL_INFOW | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_RCVBUF | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_RCVLOWAT | |||||||||
| SO_RCVTIMEO | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_RANDOMIZE_PORT | 是的 | 是的 | 是的 | 是的 | |||||
| SO_REUSEADDR | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_REUSE_UNICASTPORT | 是的 | ||||||||
| SO_REUSE_MULTICASTPORT | 是的 | ||||||||
| SO_SNDBUF | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_SNDLOWAT | |||||||||
| SO_SNDTIMEO | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_TYPE | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 |
| SO_UPDATE_ACCEPT_CONTEXT | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |
| SO_UPDATE_CONNECT_CONTEXT | 是的 | 是的 | 是的 | 是的 | 是的 | 是的 | |||
| SO_USELOOPBACK |
Remarks
SOL_SOCKET套接字选项在多个 Winsock 头文件中定义:
- Winsock2.h
- Mswsock.h
- Ws2def.h
在为Windows Vista及更高版本发布的Microsoft Windows软件开发工具包(SDK)上,头文件的组织已更改,SOL_SOCKET级别在 Winsock2.h 头文件中自动包含的 Ws2def.h 头文件中定义。 Winsock2.h 和 Mswsock.h 头文件中定义了一些SOL_SOCKET套接字选项。 其余SOL_SOCKET套接字选项在 Winsock2.h 头文件自动包含的 Ws2def.h 头文件中定义。 不应直接使用 Ws2def.h 。
在针对 Windows Server 2003 和 Windows XP 发布的平台软件开发工具包(SDK)上,SOL_SOCKET级别在 Winsock2.h 头文件中定义。 SOL_SOCKET套接字选项在 Winsock2.h 和 Mswsock.h 头文件中定义。
Requirements
| Requirement | 价值 |
|---|---|
| 标题 |
|