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 |
---|---|
|
Die Adressfamilie ist nicht angegeben. |
|
Die Internetprotokoll-Adressfamilie Version 4 (IPv4). |
|
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. |
|
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. |
|
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. |
|
Die Internetprotokoll-Adressfamilie Version 6 (IPv6). |
|
Die IrDA-Adressfamilie (Infrarot Data Association).
Diese Adressfamilie wird nur unterstützt, wenn der Computer über einen Infrarotanschluss und treiber verfügt. |
|
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 |
---|---|
|
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). |
|
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). |
|
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. |
|
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. |
|
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.
[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.
[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 |
---|---|
|
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. |
|
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 |
|
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 |
|
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 |
|
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 |
|
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. |
|
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. |
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.
Fehlercode | Bedeutung |
---|---|
Ein erfolgreicher WSAStartup Aufrufs muss erfolgen, bevor diese Funktion verwendet wird. | |
Fehler des Netzwerksubsystems. | |
Die angegebene Adressfamilie wird nicht unterstützt. | |
Der lpProtocolInfo Parameter befindet sich nicht in einem gültigen Teil des Prozessadressraums. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Dieser Wert gilt für eine der folgenden Bedingungen.
|
|
Der Dienstanbieter hat eine andere Version als 2.2 zurückgegeben. | |
Der Dienstanbieter hat eine ungültige oder unvollständige Prozedurtabelle an die WSPStartup-zurückgegeben. | |
Es sind keine weiteren Socketdeskriptoren verfügbar. | |
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht erstellt werden. | |
Das angegebene Protokoll wird nicht unterstützt. | |
Das angegebene Protokoll ist der falsche Typ für diesen Socket. | |
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. | |
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.
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 |