共用方式為


WSASocketW 函式 (winsock2.h)

WSASocket 函式會建立系結至特定傳輸服務提供者的套接字。

語法

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

參數

[in] af

位址系列規格。 位址系列可能的值定義於 Winsock2.h 頭檔中。

在 Windows Vista 和更新版本的 Windows SDK 上,頭檔的組織已變更,而且位址系列可能的值定義於 Ws2def.h 頭檔。 請注意,Ws2def.h 頭文件會自動包含在 Winsock2.h中,而且不應該直接使用。

目前支援的值是AF_INET或AF_INET6,這是IPv4和IPv6的因特網位址系列格式。 如果已安裝位址系列 Windows Sockets 服務提供者,則支援位址系列的其他選項(例如,AF_NETBIOS與 NetBIOS 搭配使用)。 請注意,AF_位址系列和PF_通訊協定系列常數的值相同(例如,AF_INETPF_INET),因此可以使用任一常數。

下表列出位址家族的常見值,但可能有許多其他值。

Af 意義
AF_UNSPEC
0
未指定位址系列。
AF_INET
2
因特網通訊協定第 4 版 (IPv4) 位址系列。
AF_IPX
6
IPX/SPX 位址系列。 只有在安裝 NWLink IPX/SPX NetBIOS 相容傳輸通訊協定時,才支援此位址系列。

Windows Vista 和更新版本不支援此位址系列。

AF_APPLETALK
16
AppleTalk 位址系列。 只有在安裝 AppleTalk 通訊協定時,才支援此位址系列。

Windows Vista 和更新版本不支援此位址系列。

AF_NETBIOS
17
NetBIOS 位址系列。 只有在已安裝 NetBIOS 的 Windows Sockets 提供者時,才支援此位址系列。

32 位版本的 Windows 支援 NetBIOS 的 Windows Sockets 提供者。 此提供者預設會在32位版本的Windows上安裝。

64 位版本的 Windows 不支援 NetBIOS 的 Windows Sockets 提供者,包括 Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 或 Windows XP。

NetBIOS 的 Windows Sockets 提供者僅支援將 類型 參數設定為 SOCK_DGRAM的套接字。

NetBIOS 的 Windows Sockets 提供者與 NetBIOS 程式設計介面不直接相關。 Windows Vista、Windows Server 2008 及更新版本不支援 NetBIOS 程式設計介面。

AF_INET6
23
因特網通訊協定第 6 版 (IPv6) 位址系列。
AF_IRDA
26
紅外數據協會 (IrDA) 位址系列。

只有在計算機已安裝紅外埠和驅動程式時,才支援此位址系列。

AF_BTH
32
藍牙位址系列。

如果計算機已安裝藍牙適配卡和驅動程式,則 Windows XP 支援此位址系列與 SP2 或更新版本。

[in] type

新套接字的類型規格。

套接字類型的可能值定義於 Winsock2.h 頭檔中。

下表列出 Windows Sockets 2 支援的 類型 參數的可能值:

類型 意義
SOCK_STREAM
1
套接字類型,提供具有 OOB 數據傳輸機制的循序、可靠、雙向、連線型位元組數據流。 此套接字類型會針對因特網位址系列使用傳輸控制通訊協定(TCP)(AF_INET或AF_INET6)。
SOCK_DGRAM
2
支持數據報的套接字類型,這些數據報是固定(通常很小)最大長度的無連線、不可靠的緩衝區。 此套接字類型會針對因特網位址系列使用用戶數據報通訊協定 (UDP)(AF_INET或AF_INET6)。
SOCK_RAW
3
提供原始套接字的套接字類型,可讓應用程式作下一個上層通訊協議標頭。 若要作 IPv4 標頭,必須在套接字上設定 IP_HDRINCL 套接字選項。 若要作 IPv6 標頭,必須在套接字上設定 IPV6_HDRINCL 套接字選項。
SOCK_RDM
4
提供可靠訊息數據報的套接字類型。 此類型的範例是 Windows 中的務實一般多播(PGM)多播通訊協議實作,通常稱為 可靠的多播程式設計

只有在安裝可靠的多播通訊協定時,才支援此 類型 值。

SOCK_SEQPACKET
5
套接字類型,提供以數據報為基礎的虛擬串流封包。
 

在 Windows Sockets 2 中,引進了新的套接字類型。 應用程式可以透過 WSAEnumProtocols 函式,動態探索每個可用傳輸通訊協議的屬性。 因此,應用程式可以判斷位址系列可能的套接字類型和通訊協定選項,並在指定此參數時使用這項資訊。 Winsock2.hWs2def.h 頭檔中的套接字類型定義將會定期更新,因為定義了新的套接字類型、位址系列和通訊協定。

在 Windows Sockets 1.1 中,唯一可能的套接字類型是 SOCK_DGRAMSOCK_STREAM

[in] protocol

要使用的通訊協定。 通訊協定 參數的可能選項是指定位址系列和套接字類型的特定選項。 通訊協定 的可能值定義於 Winsock2.hWsrm.h 頭檔中。

在 Windows Vista 和更新版本的 Windows SDK 上,頭文件的組織已變更,此參數可以是 Ws2def.h 頭文件中定義的 IPPROTO 列舉類型的其中一個值。 請注意,Ws2def.h 頭文件會自動包含在 Winsock2.h中,而且不應該直接使用。

如果指定了 0 值,則呼叫端不想要指定通訊協定,服務提供者會選擇要使用的 通訊協定

af 參數AF_INET或AF_INET6且 類型SOCK_RAW時,通訊協定 所指定的值會設定在 IPv6 或 IPv4 封包標頭的通訊協定欄位中。

下表列出 通訊協定 的一般值,但可能有許多其他值。

協定 意義
IPPROTO_ICMP
1
因特網控制訊息通訊協定(ICMP)。 當 af 參數 AF_UNSPECAF_INETAF_INET6,且 類型 參數 SOCK_RAW 或未指定時,這是可能的值。

Windows XP 和更新版本支援此 通訊協定 值。

IPPROTO_IGMP
2
因特網群組管理通訊協定(IGMP)。 當 af 參數 AF_UNSPECAF_INETAF_INET6,且 類型 參數 SOCK_RAW 或未指定時,這是可能的值。

Windows XP 和更新版本支援此 通訊協定 值。

BTHPROTO_RFCOMM
3
藍牙無線電頻率通訊(藍牙 RFCOMM) 通訊協定。 當 af 參數 AF_BTH類型 參數 SOCK_STREAM時,這是可能的值。

Windows XP 支援這個 通訊協定 值與 SP2 或更新版本。

IPPROTO_TCP
6
傳輸控制通訊協定 (TCP) 。 當 af 參數 AF_INETAF_INET6,且 類型 參數 SOCK_STREAM時,這是可能的值。
IPPROTO_UDP
17
用戶數據報通訊協定 (UDP)。 當 af 參數 AF_INETAF_INET6類型 參數 SOCK_DGRAM時,這是可能的值。
IPPROTO_ICMPV6
58
因特網控制訊息通訊協定第 6 版(ICMPv6)。 當 af 參數 AF_UNSPECAF_INETAF_INET6,且 類型 參數 SOCK_RAW 或未指定時,這是可能的值。

Windows XP 和更新版本支援此 通訊協定 值。

IPPROTO_RM
113
可靠多播的PGM通訊協定。 當 af 參數AF_INET類型 參數 SOCK_RDM時,這是可能的值。 在 Windows Vista 和更新版本的 Windows SDK 上,此通訊協定也稱為 IPPROTO_PGM

只有在安裝可靠的多播通訊協定時,才支援這個 通訊協定 值。

[in] lpProtocolInfo

定義要建立之套接字特性之 WSAPROTOCOL_INFO 結構的指標。 如果此參數未 NULL,則套接字將會繫結至與指示 WSAPROTOCOL_INFO 結構相關聯的提供者。

[in] g

建立新套接字和新套接字群組時要採取的現有套接字群組標識碼或適當的動作。

如果 g 是現有的套接字群組標識符,請將新的套接字加入此套接字群組,前提是符合此群組設定的所有需求。

如果 g 不是現有的套接字群組標識碼,則可以使用下列值。

g 意義
0
不會執行群組作業。
SG_UNCONSTRAINED_GROUP
0x01
建立不受限制的套接字群組,並讓新的套接字成為第一個成員。 對於不受限制的群組,Winsock 不會限制套接字群組中的所有套接字,而已針對 類型通訊協定 參數使用相同的值來建立。
SG_CONSTRAINED_GROUP
0x02
建立受限制的套接字群組,並讓新的套接字成為第一個成員。 針對受限制的套接字群組,Winsock 會將套接字群組中的所有套接字限制為已針對 類型通訊協定 參數建立的值相同。 受限制的套接字群組只能包含連線導向套接字,而且要求所有群組套接字上的連線都位於相同主機上的相同位址。
 
附註 公用頭檔中目前未定義SG_UNCONSTRAINED_GROUP和SG_CONSTRAINED_GROUP常數。
 

[in] dwFlags

用來指定其他套接字屬性的一組旗標。

雖然不允許某些組合,但可以設定這些旗標的組合。

價值 意義
WSA_FLAG_OVERLAPPED
0x01
建立支援重疊 I/O 作業的套接字。

大部分的套接字都應該以此旗標設定來建立。 重疊的套接字可以利用 WSASendWSASendToWSARecvWSARecvFrom,以及 WSAIoctl,讓多個作業同時起始並進行。

允許重迭作業的所有函式 (WSASendWSARecvWSASendToWSARecvFromWSAIoctl)如果與重疊作業相關的參數值 NULL,在重疊的套接字上也支援非重疊的用法。

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
建立將在多點會話中c_root的套接字。

只有當建立套接字的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的控制平面已根目錄時,才允許這個屬性。 這會以已設定 XP1_SUPPORT_MULTIPOINTXP1_MULTIPOINT_CONTROL_PLANE 旗標的 WSAPROTOCOL_INFO 結構 成員 dwServiceFlags1 表示。

lpProtocolInfo 參數不是 NULL 時,lpProtocolInfo 參數會指向傳輸提供者的 WSAPROTOCOL_INFO 結構。 當 lpProtocolInfo 參數為 NULL 時,WSAPROTOCOL_INFO 結構是以 af類型通訊協定 參數所選取的傳輸提供者為基礎。

如需多點會話的其他資訊,請參閱 多點和多播語意

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
建立將在多點會話中c_leaf的套接字。

只有當建立套接字的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的控制平面不是根目錄時,才允許這個屬性。 這會以 dwServiceFlags1WSAPROTOCOL_INFO 結構的成員來表示,其 XP1_SUPPORT_MULTIPOINT 旗標已設定,且未設定 XP1_MULTIPOINT_CONTROL_PLANE 旗標。

lpProtocolInfo 參數不是 NULL 時,lpProtocolInfo 參數會指向傳輸提供者的 WSAPROTOCOL_INFO 結構。 當 lpProtocolInfo 參數為 NULL 時,WSAPROTOCOL_INFO 結構是以 af類型通訊協定 參數所選取的傳輸提供者為基礎。

如需多點會話的其他資訊,請參閱 多點和多播語意

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
建立將在多點會話中d_root的套接字。

只有當建立套接字的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的數據平面已根目錄時,才允許此屬性。 這會以已設定 XP1_SUPPORT_MULTIPOINTXP1_MULTIPOINT_DATA_PLANE 旗標的 WSAPROTOCOL_INFO 結構 成員 dwServiceFlags1 表示。

lpProtocolInfo 參數不是 NULL 時,lpProtocolInfo 參數會指向傳輸提供者的 WSAPROTOCOL_INFO 結構。 當 lpProtocolInfo 參數為 NULL 時,WSAPROTOCOL_INFO 結構是以 af類型通訊協定 參數所選取的傳輸提供者為基礎。

如需多點會話的其他資訊,請參閱 多點和多播語意

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
建立將在多點會話中d_leaf的套接字。

只有當建立套接字的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的數據平面不是根目錄時,才允許此屬性。 這會以 dwServiceFlags1WSAPROTOCOL_INFO 結構的成員,以及未設定 XP1_SUPPORT_MULTIPOINT 旗標和未設定的 XP1_MULTIPOINT_DATA_PLANE 旗標表示。

lpProtocolInfo 參數不是 NULL 時,lpProtocolInfo 參數會指向傳輸提供者的 WSAPROTOCOL_INFO 結構。 當 lpProtocolInfo 參數為 NULL 時,WSAPROTOCOL_INFO 結構是以 af類型通訊協定 參數所選取的傳輸提供者為基礎。

如需多點會話的其他資訊,請參閱 多點和多播語意

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
建立套接字,允許在包含安全性訪問控制清單 (SACL) 的套接字上設定安全性描述符,而不只是任意訪問控制清單 (DACL)。

SCL 用於在對象上發生存取檢查時產生稽核和警示。 針對套接字,會進行存取檢查,以判斷是否應該允許套接字系結至指定給 系結 函式的特定位址。

ACCESS_SYSTEM_SECURITY 訪問許可權可控制取得或設定物件安全性描述元中 SACL 的能力。 只有在要求線程的存取令牌中啟用 SE_SECURITY_NAME 許可權時,系統才會授與此存取權。

WSA_FLAG_NO_HANDLE_INHERIT
0x80
建立不可繼承的套接字。

WSASocket 所建立的套接字句柄,或預設可繼承 套接字 函式。 設定此旗標時,套接字句柄不可繼承。

GetHandleInformation 函式可用來判斷是否已使用 WSA_FLAG_NO_HANDLE_INHERIT 旗標集建立套接字句柄。 GetHandleInformation 函式會傳回已設定 HANDLE_FLAG_INHERIT 值。

Windows 7 SP1、Windows Server 2008 R2 SP1 及更新版本支援此旗標

 
重要 針對多點套接字,只能指定其中一個 WSA_FLAG_MULTIPOINT_C_ROOTWSA_FLAG_MULTIPOINT_C_LEAF 旗標,而且只能指定其中一個 WSA_FLAG_MULTIPOINT_D_ROOTWSA_FLAG_MULTIPOINT_D_LEAF 旗標。 如需詳細資訊,請參閱 多點和多播語意
 

傳回值

如果沒有發生錯誤,WSASocket 會傳回參考新套接字的描述元。 否則,會傳回 INVALID_SOCKET的值,而且可以呼叫 WSAGetLastError來擷取特定的錯誤碼。

注意 此錯誤碼描述是Microsoft特定的。
 
錯誤碼 意義
WSANOTINITIALISED
在使用此函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統失敗。
WSAEAFNOSUPPORT
不支援指定的位址系列。
WSAEFAULT
lpProtocolInfo 參數不在行程地址空間的有效部分中。
WSAEINPROGRESS
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。
WSAEINVAL
下列任一條件的這個值都是 true。
  • 指定的參數 g 無效。
  • lpProtocolInfo 指向的 WSAPROTOCOL_INFO 結構不完整、內容無效,或先前重複的套接字作業中已使用 WSAPROTOCOL_INFO 結構。
  • 個別支援套接字三重 <af類型通訊協定> 的成員所指定的值,但指定的組合則不受支援。
WSAEINVALIDPROVIDER
服務提供者傳回 2.2 以外的版本。
WSAEINVALIDPROCTABLE
服務提供者會將無效或不完整的程式表傳回至 WSPStartup
WSAEMFILE
沒有其他套接字描述元可供使用。
WSAENOBUFS
沒有可用的緩衝區空間。 無法建立套接字。
WSAEPROTONOSUPPORT
不支援指定的通訊協定。
WSAEPROTOTYPE
指定的通訊協定是這個套接字的錯誤類型。
WSAEPROVIDERFAILEDINIT
服務提供者無法初始化。 如果分層服務提供者 (LSP) 或命名空間提供者未正確安裝,或提供者無法正確運作,則會傳回此錯誤。
WSAESOCKTNOSUPPORT
此位址系列不支援指定的套接字類型。

言論

WSASocket 函式會導致套接字描述元和與傳輸服務提供者相關聯的任何相關資源進行配置和關聯。 大部分的套接字都應該使用在 dwFlags 參數中設定的 WSA_FLAG_OVERLAPPED 屬性來建立。 使用此屬性建立的套接字支援使用重疊的 I/O 作業,以提供更高的效能。 根據預設,使用 WSASocket 函式建立的套接字將不會設定這個重疊的屬性。 相反地,套接字 函式會建立支援重疊 I/O 作業做為預設行為的套接字。

如果 lpProtocolInfo 參數 NULL,Winsock 會利用第一個可用的傳輸服務提供者,支援 af中指定的位址系列、套接字類型和通訊協議組合、類型通訊協定 參數。

如果 lpProtocolInfo 參數未 NULL,套接字將會系結至與指定之 WSAPROTOCOL_INFO 結構相關聯的提供者。 在此實例中,應用程式可以提供指令清單常數 FROM_PROTOCOL_INFO 做為任何 af類型通訊協定 參數的值。 這表示所指示 WSAPROTOCOL_INFO 結構的對應值(iAddressFamilyiSocketTypeiProtocol) 的對應值會被假設。 在任何情況下,af類型通訊協定 所指定的值會以未修改方式傳遞至傳輸服務提供者。

選取通訊協定及其支援的服務提供者時,af類型,以及 通訊協定,此程式只會選擇基底通訊協定或通訊協定鏈結,而不是本身的通訊協定層。 未鏈結的通訊協定層不會被視為在 類型af上具有部分相符專案。 也就是說,如果沒有找到適當的通訊協定,它們不會造成 WSAEAFNOSUPPORTWSAEPROTONOSUPPORT的錯誤碼。

Note 指令清單常數 AF_UNSPEC 會繼續定義於頭檔中,但強烈建議不要使用,因為這可能會在解譯 通訊協定 參數的值時造成模棱兩可。
 
建議應用程式針對 af 參數使用 AF_INET6,並建立可與 IPv4 和 IPv6 搭配使用的雙模式套接字。

如果使用 WSASocket 函式建立套接字,則 dwFlags 參數必須設定 WSA_FLAG_OVERLAPPED 屬性,SO_RCVTIMEOSO_SNDTIMEO 套接字選項才能正常運作。 否則,逾時永遠不會對套接字生效。

聯機導向的套接字,例如 SOCK_STREAM 提供全雙工連線,而且必須處於連線狀態,才能傳送或接收任何數據。 使用 連接WSAConnect 函數調用來建立與指定套接字的連線。 聯機之後,可以使用 傳送/WSASendrecv/WSARecv 呼叫來傳輸數據。 當會話完成時,應該呼叫 closesocket 函式,以釋放與套接字相關聯的資源。 針對連線導向套接字,應該呼叫 關機 函式,以停止套接字上的數據傳輸,再呼叫 closesocket 函式。

用來實作可靠連線導向套接字的通訊協議可確保數據不會遺失或重複。 如果對等通訊協定具有緩衝區空間的數據無法在合理的時間內成功傳輸,則聯機會被視為中斷,後續呼叫將會失敗,並將錯誤碼設定為 WSAETIMEDOUT

無連線、訊息導向的套接字允許使用 sendto/WSASendTorecvfrom/WSARecvFrom,來回傳送和接收數據報。 如果這類套接字連線到特定對等,可以使用 傳送/WSASend 傳送數據報傳送至該對等,而且可以使用 recv/WSARecv從這個對等接收。

不需要支援類型為 SOCK_RAW 的套接字,但建議服務提供者盡可能支援原始套接字。

WSASocket 函式可用來建立供服務使用的套接字,如此一來,如果另一個套接字嘗試系結至服務所使用的相同埠,就會產生稽核記錄。 若要啟用此選項,應用程式必須執行下列動作:

  • 呼叫 AdjustTokenPrivileges 函式,以啟用處理程式存取令牌中的 SE_SECURITY_NAME 許可權。 必須具備此許可權,才能設定物件之安全性描述元上的 ACCESS_SYSTEM_SECURITY 訪問許可權。
  • 呼叫 WSASocket 函式,以建立具有 dwFlagWSA_FLAG_ACCESS_SYSTEM_SECURITY 選項集的套接字。 如果未先呼叫 adjustTokenPrivileges 函式WSASocket 函式會失敗,以啟用此作業所需的 SE_SECURITY_NAME 許可權。
  • 呼叫 SetSecurityInfo 函式,以在套接字上使用系統存取控制清單 (SACL) 設定安全性描述項。 WSASocket 函式所傳回的套接字句柄會傳入 句柄 參數中。 如果函式成功,這會在套接字的安全性描述元上設定 ACCESS_SYSTEM_SECURITY 存取權。
  • 呼叫 系結 函式,將套接字系結至特定埠。 如果 系結 函式成功,則如果另一個套接字嘗試系結至相同的埠,就會產生稽核專案。
  • 呼叫 AdjustTokenPrivileges 函式,以移除進程存取令牌中的 SE_SECURITY_NAME 許可權,因為不再需要此許可權。

如需 ACCESS_SYSTEM_SECURITY的詳細資訊,請參閱授權檔中的 SACL 存取權稽核產生

套接字群組

WinSock 2 引進了套接字群組的概念,作為應用程式或合作應用程式集合的方法,以向基礎服務提供者指出特定套接字集是相關的,因此組成群組具有特定屬性。 群組屬性包含群組內個別套接字的相對優先順序,以及群組服務質量規格。

需要透過網路交換多媒體串流的應用程式是一個範例,其中能夠在一組套接字之間建立特定關聯性可能很有説明。 其取決於如何處理套接字群組的傳輸。

WSASocketWSAAccept 函式可用來在建立新的套接字時明確建立和加入套接字群組。 您可以使用 getsockopt 函式來擷取套接字的套接字群組識別碼,並將 層級 參數設定為 SOL_SOCKET並將 optname 參數設定為 SO_GROUP_ID。 套接字群組及其相關聯的套接字群組標識符會維持有效狀態,直到最後一個屬於此套接字群組的套接字關閉為止。 套接字群組標識碼對於指定服務提供者的所有進程而言都是唯一的。 零的套接字群組表示套接字不是套接字群組的成員。

您可以使用 getockopt 函式來存取套接字群組的相對群組優先順序,並將層級 參數設定為 SOL_SOCKET,並將 optname 參數設定為 SO_GROUP_PRIORITY。 您可以使用 setockopt 設定套接字群組的相對群組優先順序,並將 層級 參數設定為 SOL_SOCKET,並將 opt name 參數設定為 SO_GROUP_PRIORITY

Windows 隨附的 Winsock 提供者允許建立套接字群組,並強制執行SG_CONSTRAINED_GROUP。 限制套接字群組中的所有套接字都必須使用與 類型通訊協定 參數相同的值來建立。 受限制的套接字群組只能包含連線導向套接字,而且要求所有群組套接字上的連線都位於相同主機上的相同位址。 這是 Windows 隨附的 Winsock 提供者套用至套接字群組的唯一限制。 Winsock 提供者或 Windows 隨附的 TCP/IP 堆棧目前不會使用套接字群組優先順序。

範例程序代碼

下列範例示範如何使用 WSASocket 函式。
#ifndef UNICODE
#define UNICODE 1
#endif

// link with Ws2_32.lib
#pragma comment(lib,"Ws2_32.lib")

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8: Windows Phone 8 和更新版本的 Windows Phone 市集應用程式支援 WSASocketW 功能。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更新版本的 Windows 市集應用程式支援 WSASocketW 功能。

注意

winsock2.h 標頭會根據 UNICODE 預處理器常數的定義,將 WSASocket 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型 慣例。

要求

要求 價值
最低支援的用戶端 Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式]
支援的最低伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平臺 窗戶
標頭 winsock2.h
連結庫 Ws2_32.lib
DLL Ws2_32.dll

另請參閱

WSAPROTOCOL_INFO

Winsock 函式

Winsock 參考

接受

系結

closesocket

連線

取得ockname

取得

ioctlsocket

接聽

recv

選取 [

傳送

sendto

setockopt

關機

套接字