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.
Auf der für Windows Vista und höher veröffentlichten Windows SDK wurde die organization der Headerdateien geändert, und die möglichen Werte für die Adressfamilie sind in der Ws2def.h-Headerdatei definiert. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und niemals direkt verwendet werden sollte.
Die derzeit unterstützten Werte sind AF_INET oder AF_INET6, d. h. die Internetadressenfamilienformate für IPv4 und IPv6. Andere Optionen für adressfamilien (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 IPv4-Adressfamilie (Internet Protocol Version 4). |
|
Die IPX/SPX-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn das NetBIOS Compatible Transport-Protokoll NWLink IPX/SPX 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 unter 32-Bit-Versionen von Windows unterstützt. Dieser Anbieter wird standardmäßig unter 32-Bit-Versionen von Windows installiert. Der Windows Sockets-Anbieter für NetBIOS wird in 64-Bit-Versionen von Windows nicht unterstützt, einschließlich Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 oder Windows XP. Der Windows Sockets-Anbieter für NetBIOS unterstützt nur Sockets, bei denen der Typparameter auf SOCK_DGRAM festgelegt ist. Der Windows Sockets-Anbieter für NetBIOS steht nicht direkt im Zusammenhang mit der NetBIOS-Programmierschnittstelle . Die NetBIOS-Programmierschnittstelle wird unter Windows Vista, Windows Server 2008 und höher nicht unterstützt. |
|
Die IPv6-Adressfamilie (Internet Protocol Version 6). |
|
Die IrDA (Infrared Data Association) adressiert familie.
Diese Adressfamilie wird nur unterstützt, wenn auf dem Computer ein Infrarotport und treiber installiert sind. |
|
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 sind in der Winsock2.h-Headerdatei definiert.
In der folgenden Tabelle sind die möglichen Werte für den typparameter aufgeführt, der für Windows Sockets 2 unterstützt wird:
Typ | Bedeutung |
---|---|
|
Ein Sockettyp, der sequenzierte, zuverlässige, bidirektionale, verbindungsbasierte Bytedatenströme mit einem OOB-Datenübertragungsmechanismus bereitstellt. Dieser Sockettyp verwendet tcp (Transmission Control Protocol) für die Internetadressenfamilie (AF_INET oder AF_INET6). |
|
Ein Sockettyp, der Datagramme unterstützt, bei denen es sich um verbindungslose, unzuverlässige Puffer mit fester (in der Regel kleiner) maximaler Länge handelt. Dieser Sockettyp verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie (AF_INET oder AF_INET6). |
|
Ein Sockettyp, der einen unformatierten Socket bereitstellt, mit dem eine Anwendung den nächsten Protokollheader der oberen Ebene bearbeiten kann. Um den IPv4-Header zu bearbeiten, muss die Option IP_HDRINCL Socket für den Socket festgelegt werden. Um den IPv6-Header zu bearbeiten, muss die Option IPV6_HDRINCL Socket für den Socket festgelegt werden. |
|
Ein Sockettyp, der ein zuverlässiges Nachrichtendatengramm bereitstellt. Ein Beispiel für diesen Typ ist die PGM-Multicastprotokollimplementierung (Pragmatic General Multicast) in Windows, die häufig als zuverlässige Multicastprogrammierung bezeichnet wird.
Dieser Typwert wird nur unterstützt, wenn das Reliable Multicast Protocol 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 mithilfe der WSAEnumProtocols-Funktion dynamisch ermitteln. Daher kann eine Anwendung die möglichen Sockettyp- und Protokolloptionen für eine Adressfamilie ermitteln und diese Informationen beim Angeben dieses Parameters verwenden. Sockettypdefinitionen in den Headerdateien Winsock2.h und Ws2def.h werden regelmäßig aktualisiert, wenn neue Sockettypen, Adressfamilien und Protokolle definiert werden.
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 den Protokollparameter 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.
Auf der für Windows Vista und höher veröffentlichten Windows SDK wurde die organization der Headerdateien geändert, und dieser Parameter kann einer der Werte des IPPROTO-Enumerationstyps sein, der in der Ws2def.h-Headerdatei definiert ist. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und niemals direkt verwendet werden sollte.
Wenn der Wert 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_RAW ist, 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 geeignete Aktion, die beim Erstellen eines neuen Sockets und einer neuen Socketgruppe ausgeführt werden soll.
Wenn g eine vorhandene Socketgruppen-ID ist, fügen Sie den neuen Socket dieser Socketgruppe hinzu, 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 Flagsatz erstellt werden. Überlappende Sockets können WSASend, WSASendTo, WSARecv, WSARecvFrom und WSAIoctl für überlappende E/A-Vorgänge verwenden, sodass mehrere Vorgänge gleichzeitig initiiert und ausgeführt werden können. Alle Funktionen, die überlappende Vorgänge zulassen (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl), unterstützen auch die nicht überlappende Verwendung in einem überlappenden Socket, wenn die Werte für Parameter, die sich auf überlappende Vorgänge beziehen, NULL sind. |
|
Erstellen Sie einen Socket, der ein c_root in einer Mehrpunktsitzung ist.
Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Mehrpunkt- oder Multicastmechanismus unterstützt und die Steuerungsebene für eine Mehrpunktsitzung gerootet ist. Dies wird durch das dwServiceFlags1-Element der WSAPROTOCOL_INFO-Struktur mit den XP1_SUPPORT_MULTIPOINT- und XP1_MULTIPOINT_CONTROL_PLANE-Flags angegeben. Wenn der lpProtocolInfo-Parameter nicht NULL ist, wird vom lpProtocolInfo-Parameter auf die WSAPROTOCOL_INFO Struktur für den Transportanbieter verwiesen. Wenn der lpProtocolInfo-Parameter NULL ist, basiert die WSAPROTOCOL_INFO-Struktur auf dem Transportanbieter, der durch die Werte ausgewählt wird, die für die Parameter af, type und protokoll angegeben sind. Weitere Informationen zu einer Mehrpunktsitzung finden Sie unter Multipoint- und Multicastsemantik . |
|
Erstellen Sie einen Socket, der ein c_leaf in einer Mehrpunktsitzung ist.
Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Mehrpunkt- oder Multicastmechanismus unterstützt und die Steuerungsebene für eine Mehrpunktsitzung nicht gerootet ist. Dies wird durch das dwServiceFlags1-Element der WSAPROTOCOL_INFO-Struktur mit festgelegtem XP1_SUPPORT_MULTIPOINT-Flag und nicht festgelegtem XP1_MULTIPOINT_CONTROL_PLANE-Flag angegeben. Wenn der lpProtocolInfo-Parameter nicht NULL ist, wird vom lpProtocolInfo-Parameter auf die WSAPROTOCOL_INFO Struktur für den Transportanbieter verwiesen. Wenn der lpProtocolInfo-Parameter NULL ist, basiert die WSAPROTOCOL_INFO-Struktur auf dem Transportanbieter, der durch die Werte ausgewählt wird, die für die Parameter af, type und protokoll angegeben sind. Weitere Informationen zu einer Mehrpunktsitzung finden Sie unter Multipoint- und Multicastsemantik . |
|
Erstellen Sie einen Socket, der ein d_root in einer Mehrpunktsitzung ist.
Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Mehrpunkt- oder Multicastmechanismus unterstützt und die Datenebene für eine Mehrpunktsitzung gerootet ist. Dies wird durch das dwServiceFlags1-Element der WSAPROTOCOL_INFO-Struktur mit den XP1_SUPPORT_MULTIPOINT- und XP1_MULTIPOINT_DATA_PLANE-Flags angegeben. Wenn der lpProtocolInfo-Parameter nicht NULL ist, wird vom lpProtocolInfo-Parameter auf die WSAPROTOCOL_INFO Struktur für den Transportanbieter verwiesen. Wenn der lpProtocolInfo-Parameter NULL ist, basiert die WSAPROTOCOL_INFO-Struktur auf dem Transportanbieter, der durch die Werte ausgewählt wird, die für die Parameter af, type und protokoll angegeben sind. Weitere Informationen zu einer Mehrpunktsitzung finden Sie unter Multipoint- und Multicastsemantik . |
|
Erstellen Sie einen Socket, der ein d_leaf in einer Mehrpunktsitzung ist.
Dieses Attribut ist nur zulässig, wenn die WSAPROTOCOL_INFO Struktur für den Transportanbieter, der den Socket erstellt, einen Mehrpunkt- oder Multicastmechanismus unterstützt und die Datenebene für eine Mehrpunktsitzung nicht gerootet ist. Dies wird durch das dwServiceFlags1-Element der WSAPROTOCOL_INFO-Struktur mit festgelegtem XP1_SUPPORT_MULTIPOINT-Flag und nicht festgelegtem XP1_MULTIPOINT_DATA_PLANE-Flag angegeben. Wenn der lpProtocolInfo-Parameter nicht NULL ist, wird vom lpProtocolInfo-Parameter auf die WSAPROTOCOL_INFO Struktur für den Transportanbieter verwiesen. Wenn der lpProtocolInfo-Parameter NULL ist, basiert die WSAPROTOCOL_INFO-Struktur auf dem Transportanbieter, der durch die Werte ausgewählt wird, die für die Parameter af, type und protokoll angegeben sind. Weitere Informationen zu einer Mehrpunktsitzung finden Sie unter Multipoint- und Multicastsemantik . |
|
Erstellen Sie einen Socket, der es ermöglicht, einen Sicherheitsdeskriptor für den Socket festzulegen, der eine Sicherheitszugriffssteuerungsliste (Security Access Control List, SACL) im Gegensatz zu einer diskretionären Zugriffssteuerungsliste (DACL) enthält.
SACLs werden zum Generieren von Überwachungen und Alarmen verwendet, wenn eine Zugriffsüberprüfung für das Objekt erfolgt. Bei einem Socket wird eine Zugriffsüberprüfung durchgeführt, um zu bestimmen, ob der Socket an eine bestimmte Adresse gebunden werden soll, die an die Bindungsfunktion angegeben ist. Das ACCESS_SYSTEM_SECURITY Zugriffsrecht steuert die Fähigkeit, 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 oder der Socketfunktion erstelltes Sockethandle kann standardmäßig vererbt werden. Wenn dieses Flag festgelegt ist, ist das Sockethandle nicht vererbbar. Die GetHandleInformation-Funktion kann verwendet werden, um zu bestimmen, ob ein Sockethandle mit festgelegtem WSA_FLAG_NO_HANDLE_INHERIT Flag erstellt wurde. Die GetHandleInformation-Funktion gibt zurück, dass der HANDLE_FLAG_INHERIT Wert festgelegt ist. Dieses Flag 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 der Wert INVALID_SOCKET zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.
Fehlercode | Bedeutung |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Fehler beim Netzwerksubsystem. | |
Die angegebene Adressfamilie wird nicht unterstützt. | |
Der parameter lpProtocolInfo befindet sich nicht in einem gültigen Teil des Prozessadressraums. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
Dieser Wert gilt für jede 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 WSPStartup zurückgegeben. | |
Es sind keine weiteren Socketbeschreibungen verfügbar. | |
Es ist kein Pufferplatz 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. | |
Der Dienstanbieter konnte nicht initialisiert werden. Dieser Fehler wird zurückgegeben, wenn ein Mehrschichtdienstanbieter (Layered Service Provider, LSP) oder Namespaceanbieter nicht ordnungsgemäß installiert wurde oder der Anbieter nicht ordnungsgemäß funktioniert. | |
Der angegebene Sockettyp wird in dieser Adressfamilie nicht unterstützt. |
Hinweise
Die WSASocket-Funktion bewirkt, dass ein Socketdeskriptor und alle zugehörigen Ressourcen zugeordnet und einem Transportdienstanbieter zugeordnet werden. Die meisten Sockets sollten mit dem attribut WSA_FLAG_OVERLAPPED erstellt werden, das im dwFlags-Parameter festgelegt ist. Ein Socket, der mit diesem Attribut erstellt wurde, unterstützt die Verwendung von überlappenden E/A-Vorgängen, die eine höhere Leistung bieten. Standardmäßig ist für einen Socket, der mit der WSASocket-Funktion erstellt wurde, dieses überlappende Attribut nicht festgelegt. Im Gegensatz dazu erstellt die Socketfunktion einen Socket, der überlappende E/A-Vorgänge als Standardverhalten unterstützt.
Wenn der lpProtocolInfo-ParameterNULL ist, verwendet Winsock den ersten verfügbaren Transportdienstanbieter, der die angeforderte Kombination aus Adressfamilie, Sockettyp und Protokoll unterstützt, die in den Parametern af, type und protokoll angegeben ist.
Wenn der lpProtocolInfo-Parameter nicht NULL ist, wird der Socket an den Anbieter gebunden, der der angegebenen WSAPROTOCOL_INFO-Struktur zugeordnet ist. In diesem instance kann die Anwendung die Manifestkonstante FROM_PROTOCOL_INFO als Wert für jeden af-, typ- oder protokollparameter angeben. Dies gibt an, dass die entsprechenden Werte aus der angegebenen WSAPROTOCOL_INFO-Struktur (iAddressFamily, iSocketType, iProtocol) angenommen werden. In jedem Fall werden die für af, type und protocol angegebenen Werte unverändert an den Transportdienstanbieter übergeben.
Wenn Sie ein Protokoll und seinen unterstützenden Dienstanbieter basierend auf af, type und protocol auswählen, wählt dieses Verfahren nur ein Basisprotokoll oder eine Protokollkette aus, nicht eine Protokollebene selbst. Nicht verkettete Protokollebenen werden auch nicht als teilweise Übereinstimmungen vom Typ oder af betrachtet. 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 für den dwFlags-Parameter das WSA_FLAG_OVERLAPPED-Attribut festgelegt sein, damit die SO_RCVTIMEO - oder SO_SNDTIMEO-Socketoptionen ordnungsgemäß funktionieren. Andernfalls wird das Timeout nie für den Socket wirksam.
Verbindungsorientierte Sockets wie SOCK_STREAM stellen Vollduplexverbindungen bereit 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 Verbindungs- oder WSAConnect-Funktionsaufruf hergestellt. Nach der Verbindung können Daten überWSASend-/ und recv/WSARecv-Aufrufe übertragen werden. Wenn eine Sitzung abgeschlossen wurde, sollte die closesocket-Funktion aufgerufen werden, um die dem Socket zugeordneten Ressourcen freizugeben. Bei verbindungsorientierten Sockets sollte die Shutdown-Funktion aufgerufen werden, um die Datenübertragung auf dem Socket zu beenden, bevor die closesocket-Funktion aufgerufen wird.
Die Kommunikationsprotokolle, mit denen ein zuverlässiger, verbindungsorientierter Socket implementiert wird, stellen sicher, dass Daten nicht verloren gehen oder dupliziert werden. Wenn Daten, für die das Peerprotokoll Pufferspeicher hat, nicht innerhalb einer angemessenen Zeit erfolgreich übertragen werden können, wird die Verbindung als unterbrochen betrachtet, und nachfolgende Aufrufe schlagen fehl, wobei der Fehlercode 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 vonWSASendsenden/ an diesen Peer gesendet und (nur) mit recv/WSARecv von diesem Peer empfangen werden.
Die Unterstützung für Sockets vom 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 Überwachungsdatensatz generiert wird, wenn ein anderer Socket versucht, an denselben Port zu binden, der vom Dienst verwendet wird. Um diese Option zu aktivieren, muss eine Anwendung die folgenden Schritte ausführen:
- Rufen Sie die Funktion AdjustTokenPrivileges auf , um die berechtigung SE_SECURITY_NAME 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 zu erstellen, wobei die Option WSA_FLAG_ACCESS_SYSTEM_SECURITY festgelegt ist. Die WSASocket-Funktion schlägt fehl, wenn die Funktion AdjustTokenPrivileges 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 System Access Control List (SACL) für den Socket festzulegen. Das von der WSASocket-Funktion zurückgegebene Sockethandle wird im handle-Parameter übergeben. Wenn die Funktion erfolgreich ist, wird dadurch das ACCESS_SYSTEM_SECURITY Zugriffsrecht auf den Sicherheitsdeskriptor für den Socket festgelegt.
- Rufen Sie die bind-Funktion auf, um den Socket an einen bestimmten Port zu binden. Wenn die Bindfunktion erfolgreich ist, wird ein Überwachungseintrag generiert, wenn ein anderer Socket versucht, eine Bindung an denselben Port zu erstellen.
- Rufen Sie die Funktion AdjustTokenPrivileges auf , um die SE_SECURITY_NAME-Berechtigung im Zugriffstoken für den Prozess zu entfernen, da dies nicht mehr benötigt wird.
Weitere Informationen zu ACCESS_SYSTEM_SECURITY finden Sie unter SACL Access Right and Audit Generation in der Autorisierungsdokumentation.
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 mitzuteilen, dass ein bestimmter Satz von Sockets verknüpft ist und dass die so gebildete Gruppe bestimmte Attribute aufweist. Gruppenattribute umfassen relative Prioritäten der einzelnen Sockets innerhalb der Gruppe und eine Gruppenqualitätsspezifikation.Anwendungen, die Multimediadatenströme über das Netzwerk austauschen müssen, sind ein Beispiel dafür, dass es vorteilhaft sein kann, eine bestimmte Beziehung zwischen einer Reihe von Sockets herzustellen. Es hängt vom Transport ab, wie Socketgruppen behandelt werden.
Die Funktionen WSASocket und WSAAccept 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 getockopt-Funktion abgerufen werden, wobei der level-Parameter auf SOL_SOCKET und der optname-Parameter auf SO_GROUP_ID festgelegt ist. Eine Socketgruppe und die zugehörige Socketgruppen-ID bleiben gültig, bis der letzte Socket, der zu dieser Socketgruppe gehört, geschlossen wird. Socketgruppen-IDs sind für alle Prozesse für einen bestimmten Dienstanbieter eindeutig. Eine Socketgruppe von 0 (null) gibt an, dass der Socket kein Mitglied einer Socketgruppe ist.
Auf die relative Gruppenpriorität einer Socketgruppe kann mithilfe der getockopt-Funktion zugegriffen werden, wobei der level-Parameter auf SOL_SOCKET und der optname-Parameter auf SO_GROUP_PRIORITY festgelegt ist. Die relative Gruppenpriorität einer Socketgruppe kann mithilfe von setsockopt festgelegt werden, wobei der level-Parameter auf SOL_SOCKET und der optname-Parameter auf SO_GROUP_PRIORITY festgelegt ist.
Der in Windows enthaltene Winsock-Anbieter ermöglicht das Erstellen 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 die Protokollparameter 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 haben. Dies ist die einzige Einschränkung, die vom Winsock-Anbieter in Windows 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 auf 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 auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Hinweis
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 nicht codierungsneutralem Code 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 |
---|---|
Unterstützte Mindestversion (Client) | Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winsock2.h |
Bibliothek | Ws2_32.lib |
DLL | Ws2_32.dll |