Freigeben über


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
AF_UNSPEC
0
Die Adressfamilie ist nicht angegeben.
AF_INET
2
Die IPv4-Adressfamilie (Internet Protocol Version 4).
AF_IPX
6
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.

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 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.

AF_INET6
23
Die IPv6-Adressfamilie (Internet Protocol Version 6).
AF_IRDA
26
Die IrDA (Infrared Data Association) adressiert familie.

Diese Adressfamilie wird nur unterstützt, wenn auf dem Computer ein Infrarotport und treiber installiert sind.

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 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
SOCK_STREAM
1
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).
SOCK_DGRAM
2
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).
SOCK_RAW
3
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.
SOCK_RDM
4
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.

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 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.

Protokoll Bedeutung
IPPROTO_ICMP
1
Das Internet Control Message Protocol (ICMP). Dies ist ein möglicher Wert, wenn der af-ParameterAF_UNSPEC, AF_INET oder AF_INET6 ist und der TypparameterSOCK_RAW oder nicht angegeben ist.

Dieser Protokollwert 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 af-ParameterAF_UNSPEC, AF_INET oder AF_INET6 ist und der TypparameterSOCK_RAW oder nicht angegeben ist.

Dieser Protokollwert wird unter Windows XP und höher unterstützt.

BTHPROTO_RFCOMM
3
Das Bluetooth-Protokoll für Funkfrequenzkommunikation (Bluetooth RFCOMM). Dies ist ein möglicher Wert, wenn der af-ParameterAF_BTH und der Type-ParameterSOCK_STREAM ist.

Dieser Protokollwert wird unter Windows XP mit SP2 oder höher unterstützt.

IPPROTO_TCP
6
Das Tcp-Protokoll (Transmission Control Protocol). Dies ist ein möglicher Wert, wenn der af-ParameterAF_INET oder AF_INET6 und der TypparameterSOCK_STREAM ist.
IPPROTO_UDP
17
Das User Datagram Protocol (UDP). Dies ist ein möglicher Wert, wenn der af-ParameterAF_INET oder AF_INET6 und der TypparameterSOCK_DGRAM ist.
IPPROTO_ICMPV6
58
Internet Control Message Protocol Version 6 (ICMPv6). Dies ist ein möglicher Wert, wenn der af-ParameterAF_UNSPEC, AF_INET oder AF_INET6 ist und der TypparameterSOCK_RAW oder nicht angegeben ist.

Dieser Protokollwert wird unter Windows XP und höher unterstützt.

IPPROTO_RM
113
Das PGM-Protokoll für zuverlässiges Multicast. Dies ist ein möglicher Wert, wenn der af-ParameterAF_INET und der Type-ParameterSOCK_RDM ist. Auf der für Windows Vista und höher veröffentlichten Windows SDK wird dieses Protokoll auch als IPPROTO_PGM bezeichnet.

Dieser Protokollwert wird nur unterstützt, wenn das Reliable Multicast Protocol installiert ist.

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
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Das Netzwerksubsystem oder der zugeordnete Dienstanbieter ist fehlgeschlagen.
WSAEAFNOSUPPORT
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.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEMFILE
Es sind keine weiteren Socketbeschreibungen verfügbar.
WSAEINVAL
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.
WSAEINVALIDPROVIDER
Der Dienstanbieter hat eine andere Version als 2.2 zurückgegeben.
WSAEINVALIDPROCTABLE
Der Dienstanbieter hat eine ungültige oder unvollständige Prozedurtabelle an WSPStartup zurückgegeben.
WSAENOBUFS
Es ist kein Pufferplatz 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
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.
WSAESOCKTNOSUPPORT
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.

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

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.

Hinweis Unter Windows NT sind für die Unterstützung für unformatierte Sockets Administratorrechte erforderlich.
 
Ein Socket mit dem TypparameterSOCK_SEQPACKET basiert auf Datagrammen, fungiert jedoch als Pseudostreamprotokoll. Für Sende- und Empfangspakete werden separate Datagramme verwendet. Windows Sockets können jedoch mehrere Empfangspakete zu einem einzelnen Paket zusammenfügen. So kann eine Anwendung einen Empfangsanruf (z. B. recv oder WSARecvEx) ausgeben und die Daten aus mehreren zusammengefakteten mehreren Paketen in einem einzigen Aufruf abrufen. Die AF_NETBIOS Adressfamilie unterstützt einen Typparametervon SOCK_SEQPACKET.

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.
Ein Socket für die Verwendung mit der AF_IRDA Adressfamilie kann nur erstellt werden, wenn auf dem lokalen Computer ein Infrarotport und treiber installiert sind. Andernfalls schlägt ein Aufruf der Socketfunktion mit dem af-Parameter fehl, der auf AF_IRDA festgelegt ist, und WSAGetLastError gibt WSAEPROTONOSUPPORT zurück.

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

Weitere Informationen

IPPROTO_IP Socketoptionen

IPPROTO_IPV6 Socketoptionen

Zuverlässige Multicastprogrammierung

WSASocket

Winsock-Funktionen

Winsock-Referenz

Akzeptieren

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

send

Sendto

setsockopt

shutdown