在大部分情況下,Winsock Kernel(WSK)應用程式無法將套接字綁定到已被其他套接字使用的本機傳輸位址。 WSK 應用程式可以使用 SO_EXCLUSIVEADDRUSE 和 SO_REUSEADDR 套接字選項來控制套接字所系結之本機傳輸地址的共用。 預設情況下,這些套接字選項中的任一個都不會設定為套接字。 如需設定套接字選項的詳細資訊,請參閱 在套接字上執行控制作業。
下表顯示將第二個套接字系結至已被另一個套接字使用的本機傳輸地址的結果。 通配符和特定情況會決定套接字是系結至通配符本機傳輸地址還是特定本機傳輸地址。
第二個系結 | 第一個系結 | ||||||
---|---|---|---|---|---|---|---|
沒有連接埠選項(預設) |
SO_REUSEADDR |
SO_EXCLUSIVEADDRUSE |
|||||
通配符 |
特定 |
通配符 |
特定 |
通配符 |
特定 |
||
沒有套接字選項 (預設值) |
通配符 |
使用中 |
成功 |
使用中 |
成功 |
使用中 |
成功 |
特定 |
請檢查 |
使用中 |
請檢查 |
否認 |
否認 |
使用中 |
|
SO_REUSEADDR |
通配符 |
否認 |
成功 |
成功 |
成功 |
否認 |
成功 |
特定 |
請檢查 |
否認 |
成功 |
成功 |
否認 |
否認 |
|
SO_EXCLUSIVEADDRUSE |
通配符 |
使用中 |
使用中 |
使用中 |
使用中 |
使用中 |
使用中 |
特定 |
請檢查 |
使用中 |
請檢查 |
使用中 |
否認 |
使用中 |
結果的定義如下:
成功
第二個套接字的系結作業成功。 WSK 子系統會傳回STATUS_SUCCESS的狀態。
INUSE
第二個套接字上的系結作業失敗。 WSK 子系統會傳回STATUS_ADDRESS_ALREADY_EXISTS的狀態。
否認
第二個套接字上的系結作業失敗。 WSK 子系統會傳回STATUS_ACCESS_DENIED的狀態。
檢查
執行存取檢查,以判斷第二個套接字上的系結作業是否成功或失敗。 如果授與存取權,系結會成功,且 WSK 子系統會傳回STATUS_SUCCESS的狀態。 如果拒絕存取,系結會失敗,且 WSK 子系統會傳回STATUS_ACCESS_DENIED的狀態。
在上表中定義的存取檢查執行的情況下,會針對第一個套接字的安全性描述元檢查第二個套接字的安全性內容進行檢查。
套接字的安全性內容是由建立套接字時傳遞給 WskSocket 函式或 WskSocketConnect 函式的 OwningProcess 和 OwningThread 參數所決定。 如果建立套接字時未指定任何特定進程或線程,則會使用建立套接字的進程安全性內容。
套接字的安全性描述元是由當建立套接字時傳遞給 WskSocket 函式或 WskSocketConnect 函式的 SecurityDescriptor 參數所指定。 如果未指定任何特定的安全性描述元,WSK 子系統會使用不允許共用傳輸地址的預設安全性描述元。 使用 SO_WSK_SECURITY 套接字選項建立套接字之後,也可以將安全性描述元套用至套接字。
如果兩個套接字系結至兩個不同的特定本機傳輸位址,則不會共用任一傳輸位址。 在此情況下,第二個系結作業一律會順利完成。