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 8 和更新版本上的 Windows Phone Store 應用程式支援 WSASocketW 函式。

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

注意

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

socket