共享传输地址
在大多数情况下,Winsock 内核 (WSK) 应用程序无法将套接字绑定到另一个套接字已在使用的本地传输地址。 WSK 应用程序可以使用 SO_EXCLUSIVEADDRUSE 和 SO_REUSEADDR 套接字选项来控制套接字绑定到的本地传输地址的共享。 默认情况下,不会为套接字设置这两个套接字选项。 有关设置套接字选项的详细信息,请参阅 对套接字执行控制操作。
下表显示了将第二个套接字绑定到另一个套接字已在使用的本地传输地址的结果。 通配符和特定情况指定套接字是绑定到通配符本地传输地址还是绑定到特定的本地传输地址。
第二个绑定 | 第一个绑定 | ||||||
---|---|---|---|---|---|---|---|
默认) (无套接字选项 |
SO_REUSEADDR |
SO_EXCLUSIVEADDRUSE |
|||||
通配符 |
特定 |
通配符 |
特定 |
通配符 |
特定 |
||
默认) (无套接字选项 |
通配符 |
INUSE |
成功 |
INUSE |
成功 |
INUSE |
成功 |
特定 |
CHECK |
INUSE |
CHECK |
否认 |
否认 |
INUSE |
|
SO_REUSEADDR |
通配符 |
否认 |
成功 |
成功 |
成功 |
否认 |
成功 |
特定 |
CHECK |
否认 |
成功 |
成功 |
否认 |
否认 |
|
SO_EXCLUSIVEADDRUSE |
通配符 |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
INUSE |
特定 |
CHECK |
INUSE |
CHECK |
INUSE |
否认 |
INUSE |
结果定义如下:
成功
第二个套接字的绑定操作成功。 WSK 子系统返回STATUS_SUCCESS状态。
INUSE
第二个套接字上的绑定操作失败。 WSK 子系统返回STATUS_ADDRESS_ALREADY_EXISTS状态。
否认
第二个套接字上的绑定操作失败。 WSK 子系统返回STATUS_ACCESS_DENIED状态。
CHECK
执行访问检查以确定第二个套接字上的绑定操作是成功还是失败。 如果授予访问权限,则绑定成功,WSK 子系统将返回STATUS_SUCCESS状态。 如果访问被拒绝,绑定将失败,WSK 子系统将返回STATUS_ACCESS_DENIED状态。
在上表中定义的执行访问检查的情况下,将对照第一个套接字的安全描述符检查第二个套接字的安全上下文。
套接字的安全上下文由 OwningProcess 和 OwningThread 参数确定,这些参数在创建套接字时传递给 WskSocket 函数或 WskSocketConnect 函数。 如果在创建套接字时未指定特定进程或线程,则使用创建套接字的进程的安全上下文。
套接字的安全描述符是由 SecurityDescriptor 参数指定的,该参数在创建套接字时传递给 WskSocket 函数或 WskSocketConnect 函数。 如果未指定特定的安全描述符,则 WSK 子系统将使用不允许共享传输地址的默认安全描述符。 使用 SO_WSK_SECURITY 套接字选项创建套接字后,还可以将安全描述符应用于套接字。
如果两个套接字绑定到两个不同的特定本地传输地址,则不会共享任一传输地址。 在这种情况下,第二个绑定操作将始终成功完成。