Funzione bind (winsock2.h)
La funzione di associazione
Sintassi
int WSAAPI bind(
[in] SOCKET s,
[in] const sockaddr *name,
[in] int namelen
);
Parametri
[in] s
Descrittore che identifica un socket non associato.
[in] name
Puntatore a un sockaddr struttura dell'indirizzo locale da assegnare al socket associato.
[in] namelen
Lunghezza, in byte, del valore a cui punta il nome parametro.
Valore restituito
Se non si verifica alcun errore, binding restituisce zero. In caso contrario, restituisce SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.
Codice di errore | Significato |
---|---|
|
|
Il sottosistema di rete non è riuscito. | |
È stato effettuato un tentativo di accesso a un socket in modo non consentito dalle autorizzazioni di accesso.
Questo errore viene restituito se un tentativo di associazione di un socket di datagrammi all'indirizzo di trasmissione non è riuscito perché l'opzione setockopt SO_BROADCAST non è abilitata. |
|
In genere è consentito un solo utilizzo di ogni indirizzo socket (protocollo/indirizzo di rete/porta).
Questo errore viene restituito se un processo nel computer è già associato allo stesso indirizzo completo e il socket non è stato contrassegnato per consentire il riutilizzo degli indirizzi con SO_REUSEADDR. Ad esempio, l'indirizzo IP e la porta specificati nel nome nome parametro sono già associati a un altro socket usato da un'altra applicazione. Per altre informazioni, vedere l'opzione socket SO_REUSEADDR nel riferimento opzioni socket |
|
L'indirizzo richiesto non è valido nel contesto.
Questo errore viene restituito se l'indirizzo specificato a cui punta il nome parametro non è un indirizzo IP locale valido nel computer. |
|
Il sistema ha rilevato un indirizzo puntatore non valido nel tentativo di usare un argomento puntatore in una chiamata.
Questo errore viene restituito se il nome |
|
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
È stato fornito un argomento non valido.
Questo errore viene restituito dal socket è già associato a un indirizzo. |
|
Impossibile eseguire un'operazione su un socket perché il sistema non disponeva di spazio sufficiente nel buffer o perché una coda era piena.
Questo errore viene restituito di buffer non sufficienti o sono disponibili troppe connessioni. |
|
È stata tentata un'operazione su un elemento che non è un socket.
Questo errore viene restituito se il descrittore nel parametro del |
Osservazioni
La funzione di associazione
Quando viene creato un socket con una chiamata alla funzione socket
Un nome è costituito da tre parti quando si usa la famiglia di indirizzi Internet:
- Famiglia di indirizzi.
- Indirizzo host.
- Numero di porta che identifica l'applicazione.
In Windows Sockets 2 il nome nome parametro non viene interpretato rigorosamente come puntatore a una struttura sockaddr. Viene eseguito il cast in questo modo per la compatibilità di Windows Sockets 1.1. I provider di servizi sono liberi di considerarlo come puntatore a un blocco di memoria di dimensioni namelen. I primi 2 byte in questo blocco (corrispondenti al membro sa_family della struttura sockaddr, il membro sin_family della struttura sockaddr_in o il membro sin6_family della struttura sockaddr_in6) devono contenere la famiglia di indirizzi usata per creare il socket. In caso contrario, si verifica un errore WSAEFAULT.
Se un'applicazione non importa quale indirizzo locale viene assegnato, specificare il valore costante INADDR_ANY per un indirizzo locale IPv4 o il valore costante in6addr_any per un indirizzo locale IPv6 nel membro sa_data del nome parametro. In questo modo il provider di servizi sottostante può usare qualsiasi indirizzo di rete appropriato, semplificando potenzialmente la programmazione delle applicazioni in presenza di host multihomed ,ovvero host con più interfacce di rete e indirizzo.
Per TCP/IP, se la porta è specificata come zero, il provider di servizi assegna una porta univoca all'applicazione dall'intervallo di porte client dinamiche. In Windows Vista e versioni successive, l'intervallo di porte client dinamiche è un valore compreso tra 49152 e 65535. Si tratta di una modifica rispetto a Windows Server 2003 e versioni precedenti in cui l'intervallo di porte client dinamiche era un valore compreso tra 1025 e 5000. Il valore massimo per l'intervallo di porte dinamiche client può essere modificato impostando un valore nella chiave del Registro di sistema seguente:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Il valore MaxUserPort del Registro di sistema imposta il valore da usare per il valore massimo dell'intervallo di porte client dinamiche. Per rendere effettiva questa impostazione, è necessario riavviare il computer.
In Windows Vista e versioni successive è possibile visualizzare e modificare l'intervallo di porte client dinamiche usando comandi netsh. L'intervallo di porte client dinamiche può essere impostato in modo diverso per UDP e TCP e anche per IPv4 e IPv6. Per altre informazioni, vedere KB 929851.
L'applicazione può usare getsockname dopo aver chiamato associare per apprendere l'indirizzo e la porta assegnata al socket. Se l'indirizzo Internet è uguale a INADDR_ANY o in6addr_any, getsockname non può necessariamente fornire l'indirizzo finché il socket non è connesso, poiché diversi indirizzi possono essere validi se l'host è multihomed. L'associazione a un numero di porta specifico diverso dalla porta 0 è sconsigliata per le applicazioni client, poiché esiste un pericolo di conflitto con un altro socket che usa già tale numero di porta nel computer locale.
Per le operazioni multicast, il metodo preferito consiste nel chiamare la funzione di associazione per associare un socket a un indirizzo IP locale e quindi unire il gruppo multicast. Anche se questo ordine di operazioni non è obbligatorio, è consigliabile. Pertanto, un'applicazione multicast seleziona prima un indirizzo IPv4 o IPv6 nel computer locale, l'indirizzo IPv4 con caratteri jolly (INADDR_ANY) o l'indirizzo IPv6 con caratteri jolly (in6addr_any). L'applicazione multicast chiamerebbe quindi la funzione di associazione con questo indirizzo nel membro sa_data del nome parametro per associare l'indirizzo IP locale al socket. Se è stato specificato un indirizzo con caratteri jolly, Windows selezionerà l'indirizzo IP locale da usare. Al termine dell'associazione funzione, un'applicazione unisce quindi il gruppo multicast di interesse. Per altre informazioni su come partecipare a un gruppo multicast, vedere la sezione relativa alla programmazione multicast . Questo socket può quindi essere usato per ricevere pacchetti multicast dal gruppo multicast usando il recv, recvfrom, WSARecv, WSARecvEx, WSARecvFromo LPFN_WSARECVMSG (WSARecvMsg).
La funzione di associazione
Note per i socket IrDA
- Il file di intestazione Af_irda.h deve essere incluso in modo esplicito.
- I nomi locali non vengono esposti in IrDA. Pertanto, i socket client IrDA non devono mai chiamare la funzione bind
prima della funzione connect . Se il socket IrDA è stato associato in precedenza a un nome di servizio usandobinding , la funzione di connessioneavrà esito negativo con SOCKET_ERROR. - Se il nome del servizio è nel formato "LSAP-SELxxx", dove xxx è un numero intero decimale nell'intervallo 1-127, l'indirizzo indica un LSAP-SEL specifico xxx anziché un nome di servizio. Nomi di servizio come questi consentono alle applicazioni server di accettare connessioni in ingresso indirizzate a uno specifico LSAP-SEL, senza prima eseguire una query del nome del servizio ISA per ottenere l'elenco LSAP-SEL associato. Un esempio di questo tipo di nome del servizio è un dispositivo non Windows che non supporta IAS.
Windows Phone 8: Questa funzione è supportata per le app di Windows Phone Store in Windows Phone 8 e versioni successive.
windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.
Esempi
Nell'esempio seguente viene illustrato l'uso della funzione di associazione . Per un altro esempio che usa la funzione di associazione
#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;
}
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 8.1, Windows Vista [app desktop | App UWP] |
server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
winsock2.h (include Winsock2.h) |
libreria |
Ws2_32.lib |
dll | Ws2_32.dll |
Vedere anche
opzioni socket