bind-Funktion (winsock2.h)
Die Bindung Funktion ordnet eine lokale Adresse einem Socket zu.
Syntax
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Parameter
[in] s
Ein Deskriptor, der einen ungebundenen Socket identifiziert.
[in] name
Ein Zeiger auf eine sockaddr- Struktur der lokalen Adresse, die dem gebundenen Socket zugewiesen werden soll.
[in] namelen
Die Länge des Werts in Byte, auf den der Name Parameter verweist.
Rückgabewert
Wenn kein Fehler auftritt, gibt Bindung Null zurück. Andernfalls wird SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen WSAGetLastErrorabgerufen werden.
Fehlercode | Bedeutung |
---|---|
Hinweis Ein erfolgreicher WSAStartup- Aufruf muss erfolgen, bevor diese Funktion verwendet wird.
|
|
Fehler des Netzwerksubsystems. | |
Es wurde versucht, auf ein Socket in einer Weise zuzugreifen, die durch seine Zugriffsberechtigungen verboten ist.
Dieser Fehler wird zurückgegeben, wenn beim Versuch, einen Datagrammsocket an die Übertragungsadresse zu binden, ein Fehler aufgetreten ist, da die option setockopt SO_BROADCAST nicht aktiviert ist. |
|
Normalerweise ist nur eine Verwendung jeder Socketadresse (Protokoll-/Netzwerkadresse/Port) zulässig.
Dieser Fehler wird zurückgegeben, wenn ein Prozess auf dem Computer bereits an dieselbe vollqualifizierte Adresse gebunden ist und der Socket nicht markiert wurde, um die Adresswiederverwendung mit SO_REUSEADDR zuzulassen. Beispielsweise sind die im Namen Parameter angegebene IP-Adresse und der Port bereits an einen anderen Socket gebunden, der von einer anderen Anwendung verwendet wird. Weitere Informationen finden Sie in der SO_REUSEADDR Socketoption in der SOL_SOCKET Socketoptionen Referenz, Verwenden von SO_REUSEADDR und SO_EXCLUSIVEADDRUSEund SO_EXCLUSIVEADDRUSE. |
|
Die angeforderte Adresse ist im Kontext ungültig.
Dieser Fehler wird zurückgegeben, wenn die angegebene Adresse, auf die der Name verweist, Parameter keine gültige lokale IP-Adresse auf diesem Computer ist. |
|
Das System hat beim Versuch, ein Zeigerargument in einem Aufruf zu verwenden, eine ungültige Zeigeradresse erkannt.
Dieser Fehler wird zurückgegeben, wenn der Name Parameter NULL ist. der Name oder Namelen Parameter kein gültiger Teil des Benutzeradressraums ist, der namelen Parameter zu klein ist, der Name Parameter enthält ein falsches Adressformat für die zugeordnete Adressfamilie oder die ersten beiden Byte des durch Namen angegebenen Speicherblocks, nicht mit der zugeordneten Adressfamilie übereinstimmen mit dem Socketdeskriptor s. |
|
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Es wurde ein ungültiges Argument angegeben.
Dieser Fehler wird vom Socket zurückgegeben, s bereits an eine Adresse gebunden ist. |
|
Ein Vorgang für einen Socket konnte nicht ausgeführt werden, da das System nicht genügend Pufferspeicher hat oder weil eine Warteschlange voll war.
Dieser Fehler wird von nicht genügend Puffern zurückgegeben, oder es gibt zu viele Verbindungen. |
|
Bei einem Vorgang wurde versucht, dass es sich nicht um einen Socket handelt.
Dieser Fehler wird zurückgegeben, wenn der Deskriptor im s Parameter kein Socket ist. |
Bemerkungen
Die Bindung Funktion ist für einen nicht verbundenen Socket erforderlich, bevor nachfolgende Aufrufe der listen--Funktion ausgeführt werden. Es wird normalerweise verwendet, um eine Bindung an verbindungsorientierte (Datenstrom) oder verbindungslose (Datagramm)-Sockets herzustellen. Die Bindung Funktion kann auch verwendet werden, um eine Bindung an einen unformatierten Socket zu erstellen (der Socket wurde durch Aufrufen der Socket--Funktion erstellt, wobei der Typ Parameter auf SOCK_RAW festgelegt ist). Die Bindungsfunktion funktion kann auch für einen nicht verbundenen Socket verwendet werden, bevor nachfolgende Aufrufe der connect, ConnectEx, WSAConnect, WSAConnectByListoder WSAConnectByName Funktionen vor Sendevorgängen verwendet werden.
Wenn ein Socket mit einem Aufruf der Socket--Funktion erstellt wird, ist es in einem Namespace (Adressfamilie) vorhanden, ihm ist jedoch kein Name zugewiesen. Verwenden Sie die Bindung Funktion, um die lokale Zuordnung des Sockets einzurichten, indem Sie einem nicht benannten Socket einen lokalen Namen zuweisen.
Ein Name besteht aus drei Teilen bei Verwendung der Internetadressenfamilie:
- Die Adressfamilie.
- Eine Hostadresse.
- Eine Portnummer, die die Anwendung identifiziert.
In Windows Sockets 2 wird der Name Parameter nicht streng als Zeiger auf eine sockaddr--Struktur interpretiert. Sie wird auf diese Weise für die Kompatibilität von Windows Sockets 1.1 umbrochen. Dienstanbieter sind frei, sie als Zeiger auf einen Speicherblock Namelenzu betrachten. Die ersten 2 Bytes in diesem Block (entsprechend dem sa_family Mitglied der sockaddr- Struktur, das sin_family Mitglied der sockaddr_in-Struktur oder das sin6_family Mitglied der sockaddr_in6-Struktur) muss die Adressfamilie enthalten, die zum Erstellen des Sockets verwendet wurde. Andernfalls tritt ein Fehler auf, der WSAEFAULT auftritt.
Wenn einer Anwendung nicht wichtig ist, welche lokale Adresse zugewiesen wird, geben Sie den Konstantenwert INADDR_ANY für eine lokale IPv4-Adresse oder den Konstantenwert in6addr_any für eine lokale IPv6-Adresse im sa_data Member des Namens Parameter an. Dies ermöglicht es dem zugrunde liegenden Dienstanbieter, jede geeignete Netzwerkadresse zu verwenden, wodurch die Anwendungsprogrammierung in Anwesenheit von multihomed Hosts (d. a. Hosts mit mehr als einer Netzwerkschnittstelle und -adresse) vereinfacht wird.
Wenn der Port für TCP/IP als Null angegeben ist, weist der Dienstanbieter der Anwendung einen eindeutigen Port aus dem dynamischen Clientportbereich zu. Unter Windows Vista und höher ist der dynamische Clientportbereich ein Wert zwischen 49152 und 65535. Dies ist eine Änderung von Windows Server 2003 und früher, bei der der dynamische Clientportbereich ein Wert zwischen 1025 und 5000 war. Der Maximalwert für den dynamischen Portbereich des Clients kann geändert werden, indem ein Wert unter dem folgenden Registrierungsschlüssel festgelegt wird:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Der MaxUserPort Registrierungswert legt den Wert fest, der für den Maximalwert des dynamischen Clientportbereichs verwendet werden soll. Sie müssen den Computer neu starten, damit diese Einstellung wirksam wird.
Unter Windows Vista und höher kann der dynamische Clientportbereich mithilfe von netsh--Befehlen angezeigt und geändert werden. Der dynamische Clientportbereich kann für UDP und TCP und auch für IPv4 und IPv6 unterschiedlich festgelegt werden. Weitere Informationen finden Sie unter KB-929851.
Die Anwendung kann getsockname verwenden, nachdem sie Bindung aufgerufen haben, um die Adresse und den Port zu erfahren, der dem Socket zugewiesen wurde. Wenn die Internetadresse mit INADDR_ANY oder in6addr_anyidentisch ist, kann ruftockname die Adresse nicht unbedingt angeben, bis der Socket verbunden ist, da mehrere Adressen gültig sein können, wenn der Host multihomed ist. Die Bindung an eine andere Portnummer als Port 0 wird für Clientanwendungen abgeraten, da eine Gefahr besteht, dass ein Konflikt mit einem anderen Socket besteht, der diese Portnummer bereits auf dem lokalen Computer verwendet.
Bei Multicastvorgängen besteht die bevorzugte Methode darin, die Bindung Funktion aufzurufen, um einen Socket einer lokalen IP-Adresse zuzuordnen und dann der Multicastgruppe beizutreten. Obwohl diese Reihenfolge der Vorgänge nicht obligatorisch ist, wird dringend empfohlen. Daher würde eine Multicastanwendung zuerst eine IPv4- oder IPv6-Adresse auf dem lokalen Computer, die IPv4-Adresse (INADDR_ANY) oder die IPv6-Adresse (in6addr_any) auswählen. Die Multicastanwendung ruft dann die Bindung Funktion mit dieser Adresse im sa_data Member des Namens Parameter auf, um die lokale IP-Adresse dem Socket zuzuordnen. Wenn eine Wildcardadresse angegeben wurde, wählt Windows die zu verwendende lokale IP-Adresse aus. Nach Abschluss der Bindung Funktion würde eine Anwendung dann der Multicastgruppe von Interesse beitreten. Weitere Informationen zum Beitreten zu einer Multicastgruppe finden Sie im Abschnitt zu Multicast programming. Dieser Socket kann dann zum Empfangen von Multicastpaketen aus der Multicastgruppe mithilfe des recv, recvfrom, WSARecv, WSARecvEx, WSARecvFromoder LPFN_WSARECVMSG (WSARecvMsg) Funktionen verwendet werden.
Die Bindung Funktion ist für Sendevorgänge an eine Multicastgruppe normalerweise nicht erforderlich. Die sendto,WSASendMsgund WSASendTo Funktionen binden den Socket implizit an die Wildcardadresse, wenn der Socket noch nicht gebunden ist. Die Bindung Funktion ist erforderlich, bevor die senden oder WSASend--Funktionen verwendet werden, die keine implizite Bindung ausführen und nur für verbundene Sockets zulässig sind, was bedeutet, dass der Socket bereits gebunden sein muss, damit er verbunden ist. Die Bindungsfunktion funktion kann verwendet werden, bevor Sendevorgänge mithilfe der sendto,WSASendMsgoder WSASendTo Funktionen verwendet werden, wenn eine Anwendung eine bestimmte lokale IP-Adresse auf einem lokalen Computer mit mehreren Netzwerkschnittstellen und lokalen IP-Adressen auswählen möchte. Andernfalls kann eine implizite Bindung an die Wildcardadresse mithilfe der Sendto-,WSASendMsg oder WSASendTo--Funktionen zu einer anderen lokalen IP-Adresse führen, die für Sendevorgänge verwendet wird.
Hinweise für IrDA-Sockets
- Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
- Lokale Namen werden in IrDA nicht verfügbar gemacht. Daher dürfen IrDA-Clientsockets niemals die Bindungsfunktion-Funktion aufrufen, bevor die -Funktion verbinden. Wenn der IrDA-Socket zuvor mit Bindungs-an einen Dienstnamen gebunden wurde, schlägt die connect-Funktion mit SOCKET_ERROR fehl.
- Wenn der Dienstname dem Format "LSAP-SELxxx" entspricht, wobei xxx eine dezimale ganze Zahl im Bereich 1-127 ist, gibt die Adresse eine bestimmte LSAP-SEL xxx anstelle eines Dienstnamens an. Dienstnamen wie diese ermöglichen Es Serveranwendungen, eingehende Verbindungen zu akzeptieren, die an eine bestimmte LSAP-SEL weitergeleitet werden, ohne zuerst eine ISA-Dienstnamenabfrage auszuführen, um die zugeordnete LSAP-SEL abzurufen. Ein Beispiel für diesen Dienstnamenstyp ist ein Nicht-Windows-Gerät, das IAS nicht unterstützt.
Windows Phone 8: Diese 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: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.
Beispiele
Im folgenden Beispiel wird die Verwendung der Bindungsfunktion veranschaulicht. Ein weiteres Beispiel, das die Bindungsfunktion verwendet, finden Sie unter Erste Schritte mit Winsock.
#ifndef UNICODE
#define UNICODE
#endif
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
int main()
{
// Declare some variables
WSADATA wsaData;
int iResult = 0; // used to return function results
// the listening socket to be created
SOCKET ListenSocket = INVALID_SOCKET;
// The socket address to be passed to bind
sockaddr_in service;
//----------------------
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR) {
wprintf(L"Error at WSAStartup()\n");
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
wprintf(L"socket function failed with error: %u\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
//----------------------
// Bind the socket.
iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
if (iResult == SOCKET_ERROR) {
wprintf(L"bind failed with error %u\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
else
wprintf(L"bind returned success\n");
WSACleanup();
return 0;
}
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 (include Winsock2.h) |
Library | Ws2_32.lib |
DLL- | Ws2_32.dll |