LPWSPBIND 回调函数 (ws2spi.h)
LPWSPBind 函数将本地地址 (即名称) 与套接字相关联。
语法
LPWSPBIND Lpwspbind;
int Lpwspbind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen,
[out] LPINT lpErrno
)
{...}
参数
[in] s
标识未绑定套接字的描述符。
[in] name
要分配给套接字的地址,采用 sockaddr 结构的形式。
除 sa_family 成员外, sockaddr 内容以网络字节顺序表示。 在 Windows 套接字 2 中, name 参数并未严格解释为指向 sockaddr 结构的指针。 它以这种方式强制转换,以便实现 Winsock 兼容性。 在不同的地址系列上下文中,实际结构的解释不同。 唯一的要求是,第一 个u_short 是地址系列,内存缓冲区的总大小(以字节为单位)是 namelen。
[in] namelen
name 参数指向的结构的长度(以字节为单位)。
[out] lpErrno
指向错误代码的指针。
返回值
如果未发生错误, LPWSPBind 将返回零。 否则,它将返回SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。
错误代码 | 含义 |
---|---|
网络子系统失败。 | |
本地计算机上的某些进程已绑定到同一个完全限定的地址 (例如,AF_INET情况下的 IP 地址和端口) ,并且套接字尚未标记为允许使用 SO_REUSEADDR 重用地址。 (请参阅 LPWSPSetSockOpt.) 下的 SO_REUSEADDR 套接字选项 | |
指定的地址不是此计算机的有效地址。 | |
name 或 namelen 参数不是用户地址空间的有效部分,namelen 参数太小,name 参数包含关联的地址系列地址格式不正确,或者 name 指定的内存块的前两个字节与与套接字描述符关联的地址系列不匹配。 | |
当回调正在进行时,将调用函数。 | |
:套接字已绑定到地址。 | |
没有足够的可用缓冲区,连接过多。 | |
:描述符不是套接字。 |
注解
在后续调用 LPWSPConnect 或 LPWSPListen 函数之前,在未连接的无连接或面向连接的套接字上使用 LPWSPBind 函数。 使用 LPWSPSocket 创建套接字时,它存在于命名空间 (地址系列) 中,但它没有分配名称或本地地址。 LPWSPBind 函数通过将本地名称分配给未命名的套接字来建立套接字的本地关联。
例如,在 Internet 地址系列中,名称由三部分组成:地址系列、主机地址和标识 Winsock SPI 客户端的端口号。 在 Windows 套接字 2 中, name 参数并未严格解释为指向 sockaddr 结构的指针。 服务提供商可以自由地将其视为指向 namelen 大小的内存块的指针。 此块中的前两个字节 (对应于 sockaddr 声明中sa_family) 必须包含用于创建套接字的地址系列。 否则,将指示错误 WSAEFAULT 。
如果 Windows 套接字 2 SPI 客户端不关心为其分配的本地地址,它将为 name 参数的 sa_data 成员指定清单常量值ADDR_ANY。 这会指示服务提供商使用任何适当的网络地址。 对于 TCP/IP,如果端口指定为零,则服务提供商将为 Winsock SPI 客户端分配一个值介于 1024 和 5000 之间的唯一端口。 SPI 客户端可以在 LPWSPBind 之后使用 LPWSPGetSockName 来了解已分配给它的地址和端口。 但请注意,如果 Internet 地址等于 INADDR_ANY, 则 LPWSPGetSockOpt 在连接套接字之前不一定能够提供地址,因为如果主机是多宿主的,则多个地址可能有效。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
标头 | ws2spi.h |