WSASocketA 函式 (winsock2.h)

WSASocket函式會建立系結至特定傳輸服務提供者的通訊端。

語法

SOCKET WSAAPI WSASocketA(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOA 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
Infrared Data Association (IrDA) 位址系列。

只有在電腦已安裝基礎結構埠和驅動程式時,才支援此位址系列。

AF_BTH
32
藍牙位址系列。

如果電腦已安裝藍牙介面卡和驅動程式,Windows XP 與 SP2 或更新版本支援此位址系列。

[in] type

新通訊端的類型規格。

通訊端類型的可能值定義在 Winsock2.h 標頭檔中。

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

類型 意義
SOCK_STREAM
1
通訊端類型,提供具有 OOB 資料傳輸機制的循序、可靠、雙向、以連線為基礎的位元組資料流程。 此通訊端類型會針對網際網路位址系列 (AF_INET或AF_INET6) 使用傳輸控制通訊協定 (TCP) 。
SOCK_DGRAM
2
支援資料包的通訊端類型,這些資料包是無連接、不可靠的固定緩衝區 (通常很小) 最大長度。 此通訊端類型會針對網際網路位址系列 (AF_INET或AF_INET6) 使用使用者資料包通訊協定 (UDP) 。
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 封包標頭的通訊協定欄位中設定。

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

protocol 意義
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 作業的通訊端。

大部分的通訊端都應該使用此旗標設定來建立。 重迭的通訊端可以利用WSASendWSASendToWSARecv、WSARecvFromWSAIoctl進行重迭的 I/O 作業,允許同時起始和進行多個作業。

允許重迭作業的所有函式 (WSASendWSARecvWSASendToWSARecvFromWSAIoctl) 也支援重迭通訊端上的非重迭使用方式,如果與重迭作業相關的參數值為 Null

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
建立將在多點會話中c_root的通訊端。

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

lpProtocolInfo 參數不是 Null 時,傳輸提供者 的WSAPROTOCOL_INFO 結構是由 lpProtocolInfo 參數所指向。 當 lpProtocolInfo 參數為 Null 時, WSAPROTOCOL_INFO 結構是以針對 aftypeprotocol 參數指定的值所選取的傳輸提供者為基礎。

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

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
建立將在多點會話中c_leaf的通訊端。

只有在建立通訊端的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的控制平面為非根節點時,才允許這個屬性。 這會以WSAPROTOCOL_INFO結構的dwServiceFlags1成員表示,其中已設定XP1_SUPPORT_MULTIPOINT旗標,且未設定XP1_MULTIPOINT_CONTROL_PLANE旗標。

lpProtocolInfo 參數不是 Null 時,傳輸提供者 的WSAPROTOCOL_INFO 結構是由 lpProtocolInfo 參數所指向。 當 lpProtocolInfo 參數為 Null 時, WSAPROTOCOL_INFO 結構是以針對 aftypeprotocol 參數指定的值所選取的傳輸提供者為基礎。

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

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
建立將在多點會話中d_root的通訊端。

只有在建立通訊端的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的資料平面已根目錄時,才允許這個屬性。 這會以已設定XP1_SUPPORT_MULTIPOINTXP1_MULTIPOINT_DATA_PLANE旗標的WSAPROTOCOL_INFO結構dwServiceFlags1成員表示。

lpProtocolInfo 參數不是 Null 時,傳輸提供者 的WSAPROTOCOL_INFO 結構是由 lpProtocolInfo 參數所指向。 當 lpProtocolInfo 參數為 Null 時, WSAPROTOCOL_INFO 結構是以針對 aftypeprotocol 參數指定的值所選取的傳輸提供者為基礎。

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

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
建立將在多點會話中d_leaf的通訊端。

只有在建立通訊端的傳輸提供者 WSAPROTOCOL_INFO 結構支援多點或多播機制,且多點會話的資料平面不是根目錄時,才允許這個屬性。 這會以WSAPROTOCOL_INFO結構的dwServiceFlags1成員表示,其中已設定XP1_SUPPORT_MULTIPOINT旗標,且未設定XP1_MULTIPOINT_DATA_PLANE旗標。

lpProtocolInfo 參數不是 Null 時,傳輸提供者 的WSAPROTOCOL_INFO 結構是由 lpProtocolInfo 參數所指向。 當 lpProtocolInfo 參數為 Null 時, WSAPROTOCOL_INFO 結構是以針對 aftypeprotocol 參數指定的值所選取的傳輸提供者為基礎。

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

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) 所假設的對應值。 在任何情況下,針對 aftypeprotocol 指定的值會未修改地傳遞至傳輸服務提供者。

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

注意 資訊清單常數 AF_UNSPEC 會繼續定義于標頭檔中,但強烈建議不要使用,因為這可能會導致解譯 通訊協定 參數的值模棱兩可。
 
建議應用程式針對af參數使用AF_INET6,並建立可搭配 IPv4 和 IPv6 使用的雙模式通訊端。

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

SOCK_STREAM之類的連線導向通訊端提供全雙工連線,而且必須處於線上狀態,才能傳送或接收任何資料。 使用 connectWSAConnect 函式呼叫建立與指定通訊端的連線。 連線之後,可以使用傳送/WSASendrecv/WSARecv呼叫來傳輸資料。 當會話完成時,應該呼叫 closesocket 函式來釋放與通訊端相關聯的資源。 針對連線導向通訊端,應該先呼叫 shutdown 函式,以在呼叫 closesocket 函式之前停止通訊端上的資料傳輸。

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

無連線的訊息導向通訊端允許使用sendto/WSASendTorecvfrom/WSARecvFrom,在任意對等端傳送和接收資料包。 如果這類通訊端連線到特定對等,可以使用傳送/WSASend將資料包傳送至該對等,而且只能從 (接收,而只能使用recv/WSARecv) 此對等。

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

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

  • 呼叫 AdjustTokenPrivileges 函 式,以啟用進程存取權杖中的 SE_SECURITY_NAME 許可權。 需要此許可權,才能設定物件之安全性描述元的 ACCESS_SYSTEM_SECURITY 存取權限。
  • 呼叫WSASocket函式,以使用已設定WSA_FLAG_ACCESS_SYSTEM_SECURITY選項的dwFlag建立通訊端。 如果未先呼叫AdjustTokenPrivileges函式,以啟用此作業所需的SE_SECURITY_NAME許可權,WSASocket函式將會失敗。
  • 呼叫SetSecurityInfo函式,以在通訊端上使用 System 存取控制 List (SACL) 來設定安全性描述項。 WSASocket函式所傳回的通訊端控制碼會在handle參數中傳遞。 如果函式成功,這會在通訊端的安全性描述項上設定 ACCESS_SYSTEM_SECURITY 存取權限。
  • 呼叫 bind 函式,將通訊端系結至特定埠。 如果 系結 函式成功,則如果另一個通訊端嘗試系結至相同的埠,就會產生稽核專案。
  • 呼叫 AdjustTokenPrivileges 函式,以移除進程存取權杖中的 SE_SECURITY_NAME 許可權,因為不再需要此許可權。

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

通訊端群組

WinSock 2 引進了通訊端群組的概念,做為應用程式或應用程式組合的方法,以向基礎服務提供者指出特定通訊端集相關,且群組形成的特定屬性。 群組屬性包括群組內個別通訊端的相對優先順序,以及一組服務品質規格。

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

WSASocketWSAAccept函式可用來在建立新的通訊端時明確建立和聯結通訊端群組。 您可以使用 取得ockopt 函式來擷取通訊端的通訊端群組識別碼,並將 level 參數設定為 SOL_SOCKET ,並將 optname 參數設定為 SO_GROUP_ID。 通訊端群組及其相關聯的通訊端群組識別碼會維持有效狀態,直到最後一個屬於此通訊端群組的通訊端關閉為止。 通訊端群組識別碼在指定服務提供者的所有進程中都是唯一的。 零的通訊端群組表示通訊端不是通訊端群組的成員。

您可以使用 getockopt 函式來存取通訊端群組的相對群組優先順序,並將 level 參數設定為 SOL_SOCKET ,並將 optname 參數設定為 SO_GROUP_PRIORITY。 您可以使用 setockopt 設定 通訊端群組的相對群組優先順序,並將 level 參數設定為 SOL_SOCKET,並將 optname 參數設定為 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 Windows Phone 8 和更新版本上的市集應用程式支援WSASocketW函式。

Windows 8.1Windows Server 2012 R2:Windows 市集應用程式支援WSASocketW函式,Windows 8.1、Windows Server 2012 R2 和更新版本。

注意

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

規格需求

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

另請參閱

WSAPROTOCOL_INFO

Winsock 函式

Winsock 參考

接受

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

recv

recvfrom

select

send

sendto

setsockopt

shutdown

插座