socket-Funktion (winsock2.h)
Die Socketfunktion erstellt einen Socket, der an einen bestimmten Transportdienstanbieter gebunden ist.
Syntax
SOCKET WSAAPI socket(
[in] int af,
[in] int type,
[in] int protocol
);
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.
Rückgabewert
Wenn kein Fehler auftritt, gibt der Socket 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. | |
Das Netzwerksubsystem oder der zugeordnete Dienstanbieter ist fehlgeschlagen. | |
Die angegebene Adressfamilie wird nicht unterstützt. Beispielsweise hat eine Anwendung versucht, einen Socket für die AF_IRDA Adressfamilie zu erstellen, aber auf dem lokalen Computer sind kein Infrarotadapter und Gerätetreiber installiert. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion. | |
Es sind keine weiteren Socketbeschreibungen verfügbar. | |
Ein ungültiges Argument wurde angegeben. Dieser Fehler wird zurückgegeben, wenn der af-Parameter auf AF_UNSPEC festgelegt ist und der Typ und der Protokollparameter nicht angegeben sind. | |
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 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 Socketfunktion bewirkt, dass ein Socketdeskriptor und alle zugehörigen Ressourcen einem bestimmten Transportdienstanbieter zugeordnet und gebunden werden. Winsock verwendet den ersten verfügbaren Dienstanbieter, der die angeforderte Kombination aus Adressfamilie, Sockettyp und Protokollparametern unterstützt. Der erstellte Socket weist das überlappende Attribut als Standard auf. Für Windows kann sich die in Mswsock.h definierte Microsoft-spezifische Socketoption SO_OPENTYPE auf diese Standardeinstellung auswirken. Eine ausführliche Beschreibung der SO_OPENTYPE finden Sie in der Microsoft-spezifischen Dokumentation.
Sockets ohne das überlappende Attribut können mithilfe von WSASocket erstellt werden. Alle Funktionen, die überlappende Vorgänge zulassen (WSASend, WSARecv, WSASendTo, WSARecvFrom und WSAIoctl), unterstützen auch die nicht überlappende Verwendung in einem überlappenden Socket, wenn die Werte für Parameter im Zusammenhang mit überlappenden Vorgängen NULL sind.
Bei der Auswahl eines Protokolls und seines unterstützenden Dienstanbieters wählt dieses Verfahren nur ein Basisprotokoll oder eine Protokollkette aus, nicht eine Protokollebene allein. Nicht verkettete Protokollebenen werden nicht als teilgleiche Typen oder af betrachtet. Das heißt, sie führen nicht zu einem Fehlercode von WSAEAFNOSUPPORT oder WSAEPROTONOSUPPORT , wenn kein geeignetes Protokoll gefunden wird.
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 anderen Socket wird mit einem Verbindungsaufruf erstellt. Sobald die Verbindung hergestellt wurde, können Daten über Send- und Recv-Anrufe übertragen werden. Wenn eine Sitzung abgeschlossen wurde, muss ein Closesocket ausgeführt werden.
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 und recvfrom. Wenn ein solcher Socket mit einem bestimmten Peer verbunden ist, können Datagramme mithilfe von send an diesen Peer gesendet und nur von diesem Peer mit recv empfangen werden.
IPv6 und IPv4 funktionieren unterschiedlich, wenn ein Socket mit einem Typvon SOCK_RAW empfangen wird. Das IPv4-Empfangspaket enthält die Paketnutzlast, den nächsten Header auf oberster Ebene (z. B. den IP-Header für ein TCP- oder UDP-Paket) und den IPv4-Paketheader. Das IPv6-Empfangspaket enthält die Paketnutzlast und den nächsten Header der oberen Ebene. Das IPv6-Empfangspaket enthält nie den IPv6-Paketheader.
Wenn der af-Parameter für NetBIOS über TCP/IP AF_NETBIOS ist, kann der Type-ParameterSOCK_DGRAM oder SOCK_SEQPACKET werden. Für die AF_NETBIOS Adressfamilie ist der Protokollparameter die LAN-Adapternummer, die als negative Zahl dargestellt wird.
Unter Windows XP und höher kann der folgende Befehl verwendet werden, um den Windows Sockets-Katalog aufzulisten, um die installierten Dienstanbieter und die unterstützten Adressfamilien, Sockettypen und Protokolle zu ermitteln.
netsh winsock show catalog
Die Unterstützung für Sockets vom Typ SOCK_RAW ist nicht erforderlich, aber Dienstanbieter werden empfohlen, unformatierte Sockets als praktikabel zu unterstützen.
Hinweise zu IrDA-Sockets
Berücksichtigen Sie Folgendes:- Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
- Nur SOCK_STREAM wird unterstützt. der typ SOCK_DGRAM wird von IrDA nicht unterstützt.
- Der Protokollparameter ist für IrDA immer auf 0 festgelegt.
Beispielcode
Im folgenden Beispiel wird die Verwendung der Socketfunktion veranschaulicht, um einen Socket zu erstellen, der an einen bestimmten Transportdienstanbieter gebunden ist.#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;
// Validate the parameters
if (argc != 4) {
wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws 0 2 17\n", argv[0]);
wprintf(L" where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
return 1;
}
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
// 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);
sock = socket(iFamily, iType, iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
}
WSACleanup();
return 0;
}
Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps ab Windows Phone 8 unterstützt.
Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
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 |