Freigeben über


WSASocketW-Funktion (winsock2.h)

Die WSASocket--Funktion erstellt einen Socket, der an einen bestimmten Transportdienstanbieter gebunden ist.

Syntax

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

Parameter

[in] af

Die Adressfamilienspezifikation. Mögliche Werte für die Adressfamilie sind in der Winsock2.h Headerdatei definiert.

Im windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die Organisation von Headerdateien geändert, und die möglichen Werte für die Adressfamilie werden in der Ws2def.h Headerdatei definiert. Beachten Sie, dass die Ws2def.h Headerdatei automatisch in Winsock2.henthalten ist und niemals direkt verwendet werden sollte.

Die zurzeit unterstützten Werte werden AF_INET oder AF_INET6, bei denen es sich um die Internetadressenfamilienformate für IPv4 und IPv6 handelt. Andere Optionen für die Adressfamilie (z. B. AF_NETBIOS für die Verwendung mit NetBIOS) werden unterstützt, wenn ein Windows Sockets-Dienstanbieter für die Adressfamilie installiert ist. Beachten Sie, dass die Werte für die AF_ Adressfamilie und PF_ Protokollfamilienkonstanten identisch sind (z. B. AF_INET und PF_INET), sodass beide Konstanten verwendet werden können.

In der folgenden Tabelle sind allgemeine Werte für die Adressfamilie aufgeführt, obwohl viele andere Werte möglich sind.

Af Bedeutung
AF_UNSPEC
0
Die Adressfamilie ist nicht angegeben.
AF_INET
2
Die Internetprotokoll-Adressfamilie Version 4 (IPv4).
AF_IPX
6
Die IPX/SPX-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn das NWLink IPX/SPX NetBIOS Compatible Transport-Protokoll installiert ist.

Diese Adressfamilie wird unter Windows Vista und höher nicht unterstützt.

AF_APPLETALK
16
Die AppleTalk-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn das AppleTalk-Protokoll installiert ist.

Diese Adressfamilie wird unter Windows Vista und höher nicht unterstützt.

AF_NETBIOS
17
Die NetBIOS-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn der Windows Sockets-Anbieter für NetBIOS installiert ist.

Der Windows Sockets-Anbieter für NetBIOS wird in 32-Bit-Versionen von Windows unterstützt. Dieser Anbieter ist standardmäßig in 32-Bit-Versionen von Windows installiert.

Der Windows Sockets-Anbieter für NetBIOS wird in 64-Bit-Versionen von Windows, einschließlich Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 oder Windows XP, nicht unterstützt.

Der Windows Sockets-Anbieter für NetBIOS unterstützt nur Sockets, bei denen der Typ Parameter auf SOCK_DGRAMfestgelegt ist.

Der Windows Sockets-Anbieter für NetBIOS bezieht sich nicht direkt auf die NetBIOS Programmierschnittstelle. Die NetBIOS-Programmierschnittstelle wird unter Windows Vista, Windows Server 2008 und höher nicht unterstützt.

AF_INET6
23
Die Internetprotokoll-Adressfamilie Version 6 (IPv6).
AF_IRDA
26
Die IrDA-Adressfamilie (Infrarot Data Association).

Diese Adressfamilie wird nur unterstützt, wenn der Computer über einen Infrarotanschluss und treiber verfügt.

AF_BTH
32
Die Bluetooth-Adressfamilie.

Diese Adressfamilie wird unter Windows XP mit SP2 oder höher unterstützt, wenn auf dem Computer ein Bluetooth-Adapter und -Treiber installiert sind.

[in] type

Die Typspezifikation für den neuen Socket.

Mögliche Werte für den Sockettyp werden in der Winsock2.h Headerdatei definiert.

In der folgenden Tabelle sind die möglichen Werte für den Typ Parameter aufgeführt, der für Windows Sockets 2 unterstützt wird:

Art Bedeutung
SOCK_STREAM
1
Ein Sockettyp, der sequenzierte, zuverlässige, bidirektionale Bytedatenströme mit einem OOB-Datenübertragungsmechanismus bereitstellt. Dieser Sockettyp verwendet das Transmission Control Protocol (TCP) für die Internetadressenfamilie (AF_INET oder AF_INET6).
SOCK_DGRAM
2
Ein Sockettyp, der Datagramme unterstützt, die verbindungslose, unzuverlässige Puffer einer festen (normalerweise kleinen) maximalen Länge sind. Dieser Sockettyp verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie (AF_INET oder AF_INET6).
SOCK_RAW
3
Ein Sockettyp, der einen unformatierten Socket bereitstellt, der es einer Anwendung ermöglicht, den nächsten Protokollheader der oberen Ebene zu bearbeiten. Um den IPv4-Header zu bearbeiten, muss die IP_HDRINCL Socketoption für den Socket festgelegt werden. Um den IPv6-Header zu bearbeiten, muss die IPV6_HDRINCL Socketoption für den Socket festgelegt werden.
SOCK_RDM
4
Ein Sockettyp, der ein zuverlässiges Nachrichtendatendiagramm bereitstellt. Ein Beispiel für diesen Typ ist die Pragmatische Multicast-Multicast(PGM)-Multicastprotokollimplementierung in Windows, die häufig als zuverlässige Multicastprogrammierungbezeichnet wird.

Dieser Typ Werts wird nur unterstützt, wenn das zuverlässige Multicastprotokoll installiert ist.

SOCK_SEQPACKET
5
Ein Sockettyp, der ein Pseudostreampaket basierend auf Datagrammen bereitstellt.
 

In Windows Sockets 2 wurden neue Sockettypen eingeführt. Eine Anwendung kann die Attribute jedes verfügbaren Transportprotokolls dynamisch über die WSAEnumProtocols-Funktion ermitteln. Daher kann eine Anwendung die möglichen Sockettyp- und Protokolloptionen für eine Adressfamilie bestimmen und diese Informationen verwenden, wenn Sie diesen Parameter angeben. Sockettypdefinitionen in der Winsock2.h und Ws2def.h Headerdateien werden regelmäßig aktualisiert, wenn neue Sockettypen, Adressfamilien und Protokolle definiert sind.

In Windows Sockets 1.1 sind die einzigen möglichen Sockettypen SOCK_DGRAM und SOCK_STREAM.

[in] protocol

Das zu verwendende Protokoll. Die möglichen Optionen für das Protokoll Parameter sind spezifisch für die angegebene Adressfamilie und den angegebenen Sockettyp. Mögliche Werte für das Protokoll werden in den Headerdateien Winsock2.h und Wsrm.h definiert.

Im windows SDK, das für Windows Vista und höher veröffentlicht wurde, hat sich die Organisation von Headerdateien geändert, und dieser Parameter kann einer der Werte aus dem IPPROTO- Enumerationstyp sein, der in der Ws2def.h Headerdatei definiert ist. Beachten Sie, dass die Ws2def.h Headerdatei automatisch in Winsock2.henthalten ist und niemals direkt verwendet werden sollte.

Wenn ein Wert von 0 angegeben wird, möchte der Aufrufer kein Protokoll angeben, und der Dienstanbieter wählt das zu verwendende -Protokoll aus.

Wenn der af-Parameter AF_INET oder AF_INET6 ist und der TypSOCK_RAWist, wird der für das Protokoll angegebene Wert im Protokollfeld des IPv6- oder IPv4-Paketheaders festgelegt.

In der folgenden Tabelle sind allgemeine Werte für das -Protokoll aufgeführt, obwohl viele andere Werte möglich sind.

Protokoll Bedeutung
IPPROTO_ICMP
1
Das Internet Control Message Protocol (ICMP). Dies ist ein möglicher Wert, wenn der parameter afAF_UNSPEC, AF_INEToder AF_INET6 und der Typ Parameter SOCK_RAW oder nicht angegeben ist.

Dieser Protokoll- Wert wird unter Windows XP und höher unterstützt.

IPPROTO_IGMP
2
Das Internet Group Management Protocol (IGMP). Dies ist ein möglicher Wert, wenn der parameter afAF_UNSPEC, AF_INEToder AF_INET6 und der Typ Parameter SOCK_RAW oder nicht angegeben ist.

Dieser Protokoll- Wert wird unter Windows XP und höher unterstützt.

BTHPROTO_RFCOMM
3
Das Bluetooth Radio Frequency Communications (Bluetooth RFCOMM)-Protokoll. Dies ist ein möglicher Wert, wenn der af-Parameter AF_BTH und der Typ Parameter SOCK_STREAMist.

Dieser Protokoll--Wert wird unter Windows XP mit SP2 oder höher unterstützt.

IPPROTO_TCP
6
Das Transmission Control Protocol (TCP). Dies ist ein möglicher Wert, wenn der parameter afAF_INET oder AF_INET6 ist und der Typ Parameter SOCK_STREAMist.
IPPROTO_UDP
17
Das User Datagram Protocol (UDP). Dies ist ein möglicher Wert, wenn der parameter afAF_INET oder AF_INET6 ist und der Typ Parameter SOCK_DGRAMist.
IPPROTO_ICMPV6
58
Das Internet Control Message Protocol, Version 6 (ICMPv6). Dies ist ein möglicher Wert, wenn der parameter afAF_UNSPEC, AF_INEToder AF_INET6 und der Typ Parameter SOCK_RAW oder nicht angegeben ist.

Dieser Protokoll- Wert wird unter Windows XP und höher unterstützt.

IPPROTO_RM
113
Das PGM-Protokoll für zuverlässige Multicasts. Dies ist ein möglicher Wert, wenn der af-Parameter AF_INET und der Typ Parameter SOCK_RDMist. Im windows SDK, das für Windows Vista und höher veröffentlicht wurde, wird dieses Protokoll auch als IPPROTO_PGMbezeichnet.

Dieser Protokoll- Wert wird nur unterstützt, wenn das zuverlässige Multicastprotokoll installiert ist.

[in] lpProtocolInfo

Ein Zeiger auf eine WSAPROTOCOL_INFO Struktur, die die Merkmale des zu erstellenden Sockets definiert. Wenn dieser Parameter nicht NULL-ist, wird der Socket an den Anbieter gebunden, der der angegebenen WSAPROTOCOL_INFO Struktur zugeordnet ist.

[in] g

Eine vorhandene Socketgruppen-ID oder eine entsprechende Aktion, die beim Erstellen eines neuen Sockets und einer neuen Socketgruppe ausgeführt werden soll.

Wenn g eine vorhandene Socketgruppen-ID ist, verbinden Sie den neuen Socket mit dieser Socketgruppe, sofern alle von dieser Gruppe festgelegten Anforderungen erfüllt sind.

Wenn g keine vorhandene Socketgruppen-ID ist, sind die folgenden Werte möglich.

g Bedeutung
0
Es wird kein Gruppenvorgang ausgeführt.
SG_UNCONSTRAINED_GROUP
0x01
Erstellen Sie eine nicht eingeschränkte Socketgruppe, und weisen Sie den neuen Socket als erstes Mitglied auf. Für eine nicht eingeschränkte Gruppe schränkt Winsock nicht alle Sockets in der Socketgruppe ein, die mit demselben Wert für den Typ und Protokoll parameter erstellt wurden.
SG_CONSTRAINED_GROUP
0x02
Erstellen Sie eine eingeschränkte Socketgruppe, und verfügen Sie über das erste Mitglied des neuen Sockets. Für eine eingeschränkte Socketgruppe schränkt Winsock alle Sockets in der Socketgruppe auf denselben Wert für den Typ und Protokoll parameter ein. Eine eingeschränkte Socketgruppe kann nur aus verbindungsorientierten Sockets bestehen und erfordert, dass Verbindungen auf allen gruppierten Sockets dieselbe Adresse auf demselben Host aufweisen.
 
Hinweis Die SG_UNCONSTRAINED_GROUP und SG_CONSTRAINED_GROUP Konstanten sind derzeit nicht in einer öffentlichen Headerdatei definiert.
 

[in] dwFlags

Eine Reihe von Flags, die zum Angeben zusätzlicher Socketattribute verwendet werden.

Eine Kombination dieser Flags kann festgelegt werden, obwohl einige Kombinationen nicht zulässig sind.

Wert Bedeutung
WSA_FLAG_OVERLAPPED
0x01
Erstellen Sie einen Socket, der überlappende E/A-Vorgänge unterstützt.

Die meisten Sockets sollten mit diesem Kennzeichensatz erstellt werden. Überlappende Sockets können WSASend, WSASendTo, WSARecv, WSARecvFromund WSAIoctl für überlappende E/A-Vorgänge verwenden, wodurch mehrere Vorgänge gleichzeitig initiiert und ausgeführt werden können.

Alle Funktionen, die überlappenden Vorgang zulassen (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) unterstützen auch die nicht überlappende Verwendung für einen überlappenden Socket, wenn die Werte für Parameter im Zusammenhang mit überlappenden Vorgängen NULLwerden.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Erstellen Sie einen Socket, der eine c_root in einer Multipoint-Sitzung sein wird.

Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO-Struktur für den Transportanbieter, der den Socket erstellt, einen Multipoint- oder Multicastmechanismus unterstützt und die Steuerungsebene für eine Multipointsitzung gerootet ist. Dies würde durch das dwServiceFlags1 Mitglied der WSAPROTOCOL_INFO Struktur angegeben werden, wobei die XP1_SUPPORT_MULTIPOINT und XP1_MULTIPOINT_CONTROL_PLANE Flags festgelegt sind.

Wenn der parameter lpProtocolInfo nicht NULL ist, wird die WSAPROTOCOL_INFO Struktur für den Transportanbieter vom lpProtocolInfo-Parameter darauf verwiesen. Wenn der parameter lpProtocolInfo NULL ist, basiert die WSAPROTOCOL_INFO Struktur auf dem Transportanbieter, der von den Werten für den af, Typund Protokoll parametern ausgewählt wurde.

Weitere Informationen zu einer Multipoint- und Multicast-Semantik finden Sie unter Multipoint-Semantik.

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Erstellen Sie einen Socket, der eine c_leaf in einer Multipoint-Sitzung sein wird.

Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO-Struktur für den Transportanbieter, der den Socket erstellt, einen Multipoint- oder Multicastmechanismus unterstützt und die Steuerungsebene für eine Multipointsitzung nicht gerootet ist. Dies würde durch das dwServiceFlags1 Mitglied der WSAPROTOCOL_INFO-Struktur angegeben, wobei das XP1_SUPPORT_MULTIPOINT Flag festgelegt ist und das XP1_MULTIPOINT_CONTROL_PLANE Flag nicht festgelegt ist.

Wenn der parameter lpProtocolInfo nicht NULL ist, wird die WSAPROTOCOL_INFO Struktur für den Transportanbieter vom lpProtocolInfo-Parameter darauf verwiesen. Wenn der parameter lpProtocolInfo NULL ist, basiert die WSAPROTOCOL_INFO Struktur auf dem Transportanbieter, der von den Werten für den af, Typund Protokoll parametern ausgewählt wurde.

Weitere Informationen zu einer Multipoint- und Multicast-Semantik finden Sie unter Multipoint-Semantik.

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Erstellen Sie einen Socket, der eine d_root in einer Multipoint-Sitzung sein wird.

Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Multipoint- oder Multicastmechanismus unterstützt und die Datenebene für eine Multipointsitzung gerootet ist. Dies würde durch das dwServiceFlags1 Mitglied der WSAPROTOCOL_INFO Struktur angegeben, wobei die XP1_SUPPORT_MULTIPOINT und XP1_MULTIPOINT_DATA_PLANE Flags festgelegt sind.

Wenn der parameter lpProtocolInfo nicht NULL ist, wird die WSAPROTOCOL_INFO Struktur für den Transportanbieter vom lpProtocolInfo-Parameter darauf verwiesen. Wenn der parameter lpProtocolInfo NULL ist, basiert die WSAPROTOCOL_INFO Struktur auf dem Transportanbieter, der von den Werten für den af, Typund Protokoll parametern ausgewählt wurde.

Weitere Informationen zu einer Multipoint- und Multicast-Semantik finden Sie unter Multipoint-Semantik.

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Erstellen Sie einen Socket, der eine d_leaf in einer Multipoint-Sitzung sein wird.

Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Multipoint- oder Multicastmechanismus unterstützt und die Datenebene für eine Multipointsitzung nicht gerootet ist. Dies würde durch das dwServiceFlags1 Mitglied der WSAPROTOCOL_INFO Struktur mit dem XP1_SUPPORT_MULTIPOINT Flag festgelegt und das XP1_MULTIPOINT_DATA_PLANE Flag nicht festgelegt.

Wenn der parameter lpProtocolInfo nicht NULL ist, wird die WSAPROTOCOL_INFO Struktur für den Transportanbieter vom lpProtocolInfo-Parameter darauf verwiesen. Wenn der parameter lpProtocolInfo NULL ist, basiert die WSAPROTOCOL_INFO Struktur auf dem Transportanbieter, der von den Werten für den af, Typund Protokoll parametern ausgewählt wurde.

Weitere Informationen zu einer Multipoint- und Multicast-Semantik finden Sie unter Multipoint-Semantik.

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Erstellen Sie einen Socket, der es ermöglicht, einen Sicherheitsdeskriptor für den Socket festzulegen, der eine Sicherheitszugriffssteuerungsliste (Security Access Control List, SACL) enthält, im Gegensatz zu einer diskretionären Zugriffssteuerungsliste (DACL).

SACLs werden zum Generieren von Audits und Alarmen verwendet, wenn eine Zugriffsüberprüfung für das Objekt auftritt. Bei einem Socket ermittelt eine Zugriffsüberprüfung, ob das Socket an eine bestimmte Adresse gebunden werden darf, die an die Bindung Funktion angegeben ist.

Die ACCESS_SYSTEM_SECURITY Zugriffsberechtigung steuert die Möglichkeit, die SACL im Sicherheitsdeskriptor eines Objekts abzurufen oder festzulegen. Das System gewährt dieses Zugriffsrecht nur, wenn die SE_SECURITY_NAME Berechtigung im Zugriffstoken des anfordernden Threads aktiviert ist.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Erstellen Sie einen Socket, der nicht vererbbar ist.

Ein vom WSASocket- erstelltes Sockethandle oder die Socket--Funktion kann standardmäßig vererbt werden. Wenn dieses Kennzeichen festgelegt ist, ist der Sockethandle nicht vererbbar.

Die GetHandleInformation--Funktion kann verwendet werden, um zu ermitteln, ob ein Sockethandle mit dem WSA_FLAG_NO_HANDLE_INHERIT Flagsatz erstellt wurde. Die GetHandleInformation--Funktion gibt zurück, dass der HANDLE_FLAG_INHERIT Wert festgelegt ist.

Dieses Kennzeichen wird unter Windows 7 mit SP1, Windows Server 2008 R2 mit SP1 und höher unterstützt.

 
Wichtige Für Multipoint-Sockets können nur eines der WSA_FLAG_MULTIPOINT_C_ROOT oder WSA_FLAG_MULTIPOINT_C_LEAF Flags angegeben werden, und nur eine der WSA_FLAG_MULTIPOINT_D_ROOT oder WSA_FLAG_MULTIPOINT_D_LEAF Flags kann angegeben werden. Weitere Informationen finden Sie unter Multipoint- und Multicastsemantik.
 

Rückgabewert

Wenn kein Fehler auftritt, gibt WSASocket einen Deskriptor zurück, der auf den neuen Socket verweist. Andernfalls wird ein Wert von INVALID_SOCKET zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen WSAGetLastError-abgerufen werden.

Hinweis Diese Fehlercodebeschreibung ist microsoftspezifisch.
 
Fehlercode Bedeutung
WSANOTINITIALISIERT
Ein erfolgreicher WSAStartup Aufrufs muss erfolgen, bevor diese Funktion verwendet wird.
WSAENETDOWN-
Fehler des Netzwerksubsystems.
WSAEAFNOSUPPORT-
Die angegebene Adressfamilie wird nicht unterstützt.
WSAEFAULT-
Der lpProtocolInfo Parameter befindet sich nicht in einem gültigen Teil des Prozessadressraums.
WSAEINPROGRESS-
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEINVAL-
Dieser Wert gilt für eine der folgenden Bedingungen.
  • Der parameter g angegeben ist ungültig.
  • Die WSAPROTOCOL_INFO Struktur, auf die lpProtocolInfo verweist, ist unvollständig, der Inhalt ist ungültig, oder die WSAPROTOCOL_INFO Struktur wurde bereits in einem früheren doppelten Socketvorgang verwendet.
  • Die für Elemente des Socket triple <af, Typund Protokoll-> angegebenen Werte werden einzeln unterstützt, die angegebene Kombination ist jedoch nicht.
WSAEINVALIDPROVIDER
Der Dienstanbieter hat eine andere Version als 2.2 zurückgegeben.
WSAEINVALIDPROCTABLE
Der Dienstanbieter hat eine ungültige oder unvollständige Prozedurtabelle an die WSPStartup-zurückgegeben.
WSAEMFILE-
Es sind keine weiteren Socketdeskriptoren verfügbar.
WSAENOBUFS
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht erstellt werden.
WSAEPROTONOSUPPORT
Das angegebene Protokoll wird nicht unterstützt.
WSAEPROTOTYPE
Das angegebene Protokoll ist der falsche Typ für diesen Socket.
WSAEPROVIDERFAILEDINIT
Fehler beim Initialisieren des Dienstanbieters. Dieser Fehler wird zurückgegeben, wenn ein Layered Service Provider (LSP) oder Namespaceanbieter nicht ordnungsgemäß installiert wurde oder der Anbieter nicht ordnungsgemäß ausgeführt wird.
WSAESOCKTNOSUPPORT-
Der angegebene Sockettyp wird in dieser Adressfamilie nicht unterstützt.

Bemerkungen

Die WSASocket--Funktion bewirkt, dass ein Socketdeskriptor und alle zugehörigen Ressourcen zugeordnet und einem Transportdienstanbieter zugeordnet werden. Die meisten Sockets sollten mit dem im dwFlags Parameter festgelegten WSA_FLAG_OVERLAPPED Attribut erstellt werden. Ein mit diesem Attribut erstelltes Socket unterstützt die Verwendung überlappender E/A-Vorgänge, die eine höhere Leistung bieten. Standardmäßig weist ein socket, der mit dem WSASocket-Funktion erstellt wurde, diesen überlappenden Attributsatz nicht auf. Im Gegensatz dazu erstellt die Socket--Funktion einen Socket, der überlappende E/A-Vorgänge als Standardverhalten unterstützt.

Wenn der parameter lpProtocolInfoNULList, verwendet Winsock den ersten verfügbaren Transportdienstanbieter, der die angeforderte Kombination aus Adressfamilie, Sockettyp und Protokoll unterstützt, die in der af, Typund Protokoll Parameter angegeben ist.

Wenn der parameter lpProtocolInfo nicht NULL-ist, wird der Socket an den Anbieter gebunden, der der angegebenen WSAPROTOCOL_INFO Struktur zugeordnet ist. In diesem Fall kann die Anwendung die Manifestkonstante FROM_PROTOCOL_INFO als Wert für einen af, Typoder Protokoll parameter angeben. Dies gibt an, dass die entsprechenden Werte aus der angegebenen WSAPROTOCOL_INFO Struktur (iAddressFamily, iSocketType, iProtocol) angenommen werden sollen. In jedem Fall werden die für af, Typund Protokoll- unverändert an den Transportdienstanbieter übergeben.

Wenn Sie ein Protokoll und seinen unterstützenden Dienstanbieter basierend auf af, Typund Protokollauswählen, wählt dieses Verfahren nur ein Basisprotokoll oder eine Protokollkette, nicht eine Protokollschicht selbst. Nicht verkettete Protokollebenen werden nicht als teilweise Übereinstimmungen für Typ oder afbetrachtet. Das heißt, sie führen nicht zu einem Fehlercode von WSAEAFNOSUPPORT oder WSAEPROTONOSUPPORT, wenn kein geeignetes Protokoll gefunden wird.

Hinweis Die Manifestkonstante AF_UNSPEC wird weiterhin in der Headerdatei definiert, die Verwendung wird jedoch dringend abgeraten, da dies zu Mehrdeutigkeit bei der Interpretation des Werts des Protokolls Parameter führen kann.
 
Anwendungen werden empfohlen, AF_INET6 für den af Parameter zu verwenden und einen Dualmodus-Socket zu erstellen, der sowohl mit IPv4 als auch mit IPv6 verwendet werden kann.

Wenn ein Socket mithilfe der WSASocket--Funktion erstellt wird, muss der dwFlags Parameter das WSA_FLAG_OVERLAPPED Attribut für die SO_RCVTIMEO oder SO_SNDTIMEO Socketoptionen für die ordnungsgemäße Funktion festgelegt haben. Andernfalls wird das Timeout nie auf den Socket wirksam.

Verbindungsorientierte Sockets wie SOCK_STREAM bieten Vollduplexverbindungen und müssen sich in einem verbundenen Zustand befinden, bevor daten gesendet oder empfangen werden können. Eine Verbindung mit einem angegebenen Socket wird mit einem Verbinden oder WSAConnect Funktionsaufruf hergestellt. Nach der Verbindung können Daten über /WSASend- übertragen und /WSARecv Anrufen recv recv. Wenn eine Sitzung abgeschlossen wurde, sollte die closesocket--Funktion aufgerufen werden, um die ressourcen freizugeben, die dem Socket zugeordnet sind. Bei verbindungsorientierten Sockets sollte das Herunterfahren Funktion aufgerufen werden, um die Datenübertragung am Socket zu beenden, bevor die closesocket--Funktion aufgerufen wird.

Die Kommunikationsprotokolle, die zum Implementieren eines zuverlässigen, verbindungsorientierten Sockets verwendet werden, stellen sicher, dass Daten nicht verloren gehen oder dupliziert werden. Wenn Daten, für die das Peerprotokoll Pufferspeicher hat, nicht innerhalb einer angemessenen Zeitspanne erfolgreich übertragen werden können, wird die Verbindung als fehlerhaft betrachtet, und nachfolgende Aufrufe schlagen mit dem Fehlercode fehl, der auf WSAETIMEDOUT-festgelegt ist.

Verbindungslose, nachrichtenorientierte Sockets ermöglichen das Senden und Empfangen von Datagrammen an und von beliebigen Peers mithilfe von sendto/WSASendTo und recvfrom/WSARecvFrom. Wenn ein solcher Socket mit einem bestimmten Peer verbunden ist, können Datagramme mithilfe senden/WSASend- an diesen Peer gesendet werden und von (nur) diesem Peer mit recv/WSARecvempfangen werden.

Unterstützung für Sockets mit Typ-SOCK_RAW ist nicht erforderlich, aber Dienstanbieter werden empfohlen, unformatierte Sockets nach Möglichkeit zu unterstützen.

Die WSASocket--Funktion kann verwendet werden, um einen Socket zu erstellen, der von einem Dienst verwendet werden soll, sodass ein anderer Socket versucht, eine Bindung an denselben vom Dienst verwendeten Port herzustellen, und der Überwachungsdatensatz generiert wird. Um diese Option zu aktivieren, müsste eine Anwendung folgendes tun:

  • Rufen Sie die AdjustTokenPrivileges--Funktion auf, um die SE_SECURITY_NAME Berechtigungen im Zugriffstoken für den Prozess zu aktivieren. Diese Berechtigung ist erforderlich, um die ACCESS_SYSTEM_SECURITY Zugriffsrechte für den Sicherheitsdeskriptor für ein Objekt festzulegen.
  • Rufen Sie die WSASocket--Funktion auf, um einen Socket mit dwFlag- mit dem Optionssatz WSA_FLAG_ACCESS_SYSTEM_SECURITY zu erstellen. Die WSASocket--Funktion schlägt fehl, wenn die AdjustTokenPrivileges- funktion nicht zuerst aufgerufen wird, um die für diesen Vorgang erforderlichen SE_SECURITY_NAME Berechtigungen zu aktivieren.
  • Rufen Sie die SetSecurityInfo--Funktion auf, um einen Sicherheitsdeskriptor mit einer Systemzugriffssteuerungsliste (SYSTEM Access Control List, SACL) für den Socket festzulegen. Das vom WSASocket Funktion zurückgegebene Sockethandle wird im Handle Parameter übergeben. Wenn die Funktion erfolgreich ist, legt dies den ACCESS_SYSTEM_SECURITY Zugriff auf den Sicherheitsdeskriptor für den Socket fest.
  • Rufen Sie die Bindung Funktion auf, um den Socket an einen bestimmten Port zu binden. Wenn die Bindung Funktion erfolgreich ist, wird ein Überwachungseintrag generiert, wenn ein anderer Socket versucht, eine Bindung an denselben Port auszuführen.
  • Rufen Sie die AdjustTokenPrivileges-Funktion auf, um die SE_SECURITY_NAME Berechtigungen im Zugriffstoken für den Prozess zu entfernen, da dies nicht mehr erforderlich ist.

Weitere Informationen zu ACCESS_SYSTEM_SECURITYfinden Sie in der Autorisierungsdokumentation unter SACL Access Right und Audit Generation.

Socketgruppen

WinSock 2 führte den Begriff einer Socketgruppe als Mittel für eine Anwendung oder eine zusammenarbeitende Gruppe von Anwendungen ein, um einem zugrunde liegenden Dienstanbieter anzugeben, dass eine bestimmte Gruppe von Sockets miteinander verknüpft ist und dass die Gruppe somit bestimmte Attribute aufweist. Gruppenattribute umfassen relative Prioritäten der einzelnen Sockets innerhalb der Gruppe und eine Gruppenqualität der Dienstspezifikation.

Anwendungen, die Multimediastreams über das Netzwerk austauschen müssen, sind ein Beispiel, in dem es möglich sein kann, eine bestimmte Beziehung zwischen einer Reihe von Sockets herzustellen. Es liegt an der Übertragung, wie Socketgruppen behandelt werden.

Die WSASocket- und WSAAccept--Funktionen können verwendet werden, um beim Erstellen eines neuen Sockets explizit eine Socketgruppe zu erstellen und zu verbinden. Die Socketgruppen-ID für einen Socket kann mithilfe der getsockopt-Funktion abgerufen werden, wobei Ebene Parameter auf SOL_SOCKET festgelegt ist und der optname Parameter auf SO_GROUP_IDfestgelegt ist. Eine Socketgruppe und die zugehörige Socketgruppen-ID bleiben gültig, bis der letzte Socket, der zu dieser Socketgruppe gehört, geschlossen ist. Socketgruppen-IDs sind für alle Prozesse für einen bestimmten Dienstanbieter eindeutig. Eine Socketgruppe von Null gibt an, dass der Socket kein Mitglied einer Socketgruppe ist.

Auf die relative Gruppenpriorität einer Socketgruppe kann mithilfe der getsockopt-Funktion zugegriffen werden, wobei der parameter Ebene auf SOL_SOCKET festgelegt ist und der optname Parameter auf SO_GROUP_PRIORITYfestgelegt ist. Die relative Gruppenpriorität einer Socketgruppe kann mithilfe setsockopt- festgelegt werden, wobei der parameter Ebene auf SOL_SOCKET festgelegt ist und der optname Parameter auf SO_GROUP_PRIORITYfestgelegt ist.

Der in Windows enthaltene Winsock-Anbieter ermöglicht die Erstellung von Socketgruppen und erzwingt die SG_CONSTRAINED_GROUP. Alle Sockets in einer eingeschränkten Socketgruppe müssen mit demselben Wert für den Typ und Protokoll parameter erstellt werden. Eine eingeschränkte Socketgruppe kann nur aus verbindungsorientierten Sockets bestehen und erfordert, dass Verbindungen auf allen gruppierten Sockets dieselbe Adresse auf demselben Host aufweisen. Dies ist die einzige Einschränkung, die von dem Winsock-Anbieter, der in Windows enthalten ist, auf eine Socketgruppe angewendet wird. Die Socketgruppenpriorität wird derzeit nicht vom Winsock-Anbieter oder dem in Windows enthaltenen TCP/IP-Stapel verwendet.

Beispielcode

Im folgenden Beispiel wird die Verwendung der WSASocket--Funktion veranschaulicht.
#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: Die WSASocketW--Funktion wird für Windows Phone Store-Apps unter Windows Phone 8 und höher unterstützt.

Windows 8.1 und Windows Server 2012 R2-: Die WSASocketW--Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anmerkung

Der winsock2.h-Header definiert WSASocket als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit Code, der nicht codierungsneutral ist, kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- winsock2.h
Library Ws2_32.lib
DLL- Ws2_32.dll

Siehe auch

WSAPROTOCOL_INFO

Winsock-Funktionen

Winsock Reference

akzeptieren

binden

Closesocket-

verbinden

getsockname

getsockopt

ioctlsocket-

recv

recvfrom

auswählen

senden

setockopt-

herunterfahren

Socket-