LPWSPSETSOCKOPT 回调函数 (ws2spi.h)

LPWSPSetSockOpt 函数设置套接字选项。

语法

LPWSPSETSOCKOPT Lpwspsetsockopt;

int Lpwspsetsockopt(
  [in]  SOCKET s,
  [in]  int level,
  [in]  int optname,
  [in]  const char *optval,
  [in]  int optlen,
  [out] LPINT lpErrno
)
{...}

参数

[in] s

标识套接字的描述符。

[in] level

定义选项的级别;支持的级别包括 SOL_SOCKET。 有关详细信息,请参阅 Winsock 附件

[in] optname

要为其设置值的套接字选项。

[in] optval

一个指向缓冲区的指针,在该缓冲区中提供所请求的选项的值。

[in] optlen

optval 缓冲区的大小(以字节为单位)。

[out] lpErrno

指向错误代码的指针。

返回值

如果未发生错误, LPWSPSetSockOpt 将返回零。 否则,将返回 值 SOCKET_ERROR ,并在 lpErrno 中提供特定的错误代码。

错误代码 含义
WSAENETDOWN
网络子系统失败。
WSAEFAULT
optval 不在进程地址空间的有效部分,或者 optlen 参数太小。
WSAEINPROGRESS
当回调正在进行时,将调用函数。
WSAEINPROGRESS
正在阻止 Windows 套接字调用,或者服务提供程序仍在处理回调函数。
WSAEINVAL
级别无效,或者 optval 中的信息无效。
WSAENETRESET
由于操作执行过程中持续的活动检测到故障,连接损坏。
WSAENOPROTOOPT
对于指定的提供程序,选项未知或不受支持。
WSAENOTCONN
设置 SO_KEEPALIVE 时,连接已重置。
WSAENOTSOCK
:描述符不是套接字。

注解

LPWSPSetSockOpt 函数设置与任何状态的任何类型的套接字关联的套接字选项的当前值。 尽管选项可以存在于多个协议级别,但它们始终存在于最上面的套接字级别。 选项会影响套接字操作,例如是否可以在套接字上发送广播消息。

有两种类型的套接字选项:启用或禁用功能或行为的布尔选项,以及需要整数值或结构的选项。 若要启用布尔选项, optval 指向非零整数。 若要禁用 选项, optval 指向等于零的整数。 optlen 参数应等于 boolean 选项的 sizeof (int) 。 对于其他选项, optval 指向包含选项所需值的整数或结构, 而 optlen 是整数或结构的长度。

有关套接字选项的详细信息,请参阅 套接字选项

level = SOL_SOCKET

类型 含义
SO_BROADCAST BOOL 在套接字上启用广播消息的传输和接收。
SO_DEBUG BOOL 记录调试信息。
SO_DONTLINGER BOOL 保留。
SO_DONTROUTE BOOL 禁用的路由:直接发送到接口。 设置此套接字选项成功,但在AF_INET套接字上将被忽略;在具有 WSAENOPROTOOPT 的AF_INET6套接字上失败。 ATM 套接字不支持此选项, (导致错误) 。
SO_GROUP_PRIORITY int 保留。
SO_KEEPALIVE BOOL 发送 keep-alives。 在 ATM 套接字上不支持 (会导致错误) 。
SO_LINGER 结构挥之不去 如果存在未输入的数据,则关闭时会一无所获。
SO_OOBINLINE BOOL 接收正常数据流中的 OOB 数据。
SO_RCVBUF int 指定为接收保留的每个套接字缓冲区空间的总量。 这与SO_MAX_MSG_SIZE无关,也不一定对应于 TCP 接收窗口的大小。
SO_REUSEADDR BOOL 允许将套接字绑定到已在使用中的地址。 (请参阅 Bind.) 不适用于 ATM 套接字。
SO_SNDBUF int 指定为发送保留的每个套接字缓冲区空间的总量。 这与SO_MAX_MSG_SIZE无关,也不一定对应于 TCP 发送窗口的大小。
PVD_CONFIG 服务提供程序依赖 此对象存储 与套接字关联的服务提供程序的配置信息。 此数据结构的确切格式特定于服务提供程序。

 

使用不支持的选项调用 LPWSPGetSockopt 将导致 lpErrno 中返回 WSAENOPROTOOPT 错误代码。

SO_DEBUG

如果 windows 套接字 SPI 客户端设置了 SO_DEBUG 选项,则建议 Windows 套接字服务提供商提供输出调试信息,但不是必需的。 生成调试信息和格式的机制超出了本规范的范围。

SO_GROUP_PRIORITY

保留。

SO_KEEPALIVE

Windows 套接字 SPI 客户端可以通过打开 SO_KEEPALIVE 套接字选项 ,请求 TCP/IP 提供程序允许在 TCP 连接上使用保持连接数据包。 Windows 套接字提供程序不需要支持使用 keep-alive:如果支持,则精确的语义特定于实现,但应符合 RFC 1122: Internet 主机的要求 - 通信层的第 4.2.3.6 节。 (此资源可能仅以英语提供。) 如果连接因保持连接而断开,则错误代码 WSAENETRESET 将返回到套接字上正在进行的任何调用,并且任何后续调用都将失败并出现 WSAENOTCONN

SO_LINGER

SO_LINGER控制未发送的数据在套接字上排队并执行 LPWSPCloseSocket 时执行的操作。 有关SO_LINGER设置影响 LPWSPCloseSocket 语义的方式的说明,请参阅 LPWSPCloseSocket。 Windows 套接字 SPI 客户端通过使用以下元素创建 optval 参数指向的 LINGER 结构来设置所需行为。

struct linger {
  u_short l_onoff;
  u_short l_linger;
}

若要启用 SO_LINGER,Windows 套接字 SPI 客户端应 将l_onoff 设置为非零值, 将l_linger 设置为零或所需的超时(以秒为单位),并调用 LPWSPSetSockOpt。 若要启用 SO_DONTLINGER,即禁用SO_LINGER, 应将l_onoff 设置为零并调用 LPWSPSetSockOpt 。 请注意,不建议在非阻塞套接字上启用具有非零超时 的SO_LINGER 。 有关详细信息,请参阅 LPWSPCloseSocket

启用 SO_LINGER 也会禁用 SO_DONTLINGER,反之亦然。 请注意,如果 禁用SO_DONTLINGER (即启用 SO_LINGER) 则不指定超时值。 在这种情况下,使用的超时依赖于实现。 如果通过启用SO_LINGER) 为套接字 (建立了以前的超时,则服务提供商应恢复此超时值

SO_REUSEADDR

默认情况下,无法 (绑定套接字,有关详细信息,请参阅 LPWSPBind) 到已在使用的本地地址。 但是,有时可能需要以这种方式重用地址。 由于每个连接都是由本地地址和远程地址的组合唯一标识的,因此,只要远程地址不同,将两个套接字绑定到同一本地地址就没有问题。 若要通知 Windows 套接字提供程序应允许套接字上的 LPWSPBind 绑定到另一个套接字已在使用的本地地址,Windows 套接字 SPI 客户端应在发出 LPWSPBind 之前为套接字设置SO_REUSEADDR套接字选项。 请注意,选项仅在 LPWSPBind 发生时解释:因此,在不绑定到现有地址的套接字上设置选项是不必要的,但无害,在 LPWSPBind 对此或任何其他套接字没有影响之后设置或重置该选项。

SO_SNDBUF

当 Windows 套接字实现支持 SO_RCVBUFSO_SNDBUF 选项时,Windows 套接字 SPI 客户端可以请求不同的缓冲区大小 (更大或更小) 。 即使服务提供商没有提供请求的整个金额,调用也可以成功。 Windows 套接字 SPI 客户端必须使用相同的选项调用 LPWSPGetSockopt ,以验证实际提供的缓冲区大小。

PVD_CONFIG

此对象存储 与套接字关联的服务提供程序的配置信息。 此数据结构的确切格式特定于服务提供程序。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
标头 ws2spi.h

另请参阅

LPWSPBind

LPWSPEventSelect

LPWSPGetSockopt

LPWSPIoctl

LPWSPSocket