Condividi tramite


Funzione bind (winsock2.h)

La funzione di associazione associa un indirizzo locale a un socket.

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
WSANOTINITIALISED
Nota È necessario eseguire una chiamata WSAStartup con esito positivo prima di usare questa funzione.
 
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEACCES
È 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.

WSAEADDRINUSE
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 SOL_SOCKET, Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSEe SO_EXCLUSIVEADDRUSE.

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

WSAEFAULT
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 nome parametro è NULL, il nome o parametro namelen non è una parte valida dello spazio degli indirizzi utente, il parametro namelen è troppo piccolo, il nome parametro contiene un formato di indirizzo non corretto per la famiglia di indirizzi associata oppure i primi due byte del blocco di memoria specificato da nome non corrispondono alla famiglia di indirizzi associata con il descrittore socket .

WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEINVAL
È stato fornito un argomento non valido.

Questo errore viene restituito dal socket è già associato a un indirizzo.

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

WSAENOTSOCK
È stata tentata un'operazione su un elemento che non è un socket.

Questo errore viene restituito se il descrittore nel parametro del non è un socket.

Osservazioni

La funzione di associazione è necessaria in un socket non connesso prima delle chiamate successive alla funzione di ascolto . Viene in genere usato per eseguire l'associazione a socket orientati alla connessione (flusso) o senza connessione (datagram). La funzione di associazione può essere usata anche per eseguire il binding a un socket non elaborato (il socket è stato creato chiamando la funzione socket con il tipo di parametro impostato su SOCK_RAW). La funzione di associazione può essere usata anche in un socket non connesso prima delle chiamate successive al connettere, ConnectEx, WSAConnect, WSAConnectByListo funzioni WSAConnectByName prima di inviare operazioni.

Quando viene creato un socket con una chiamata alla funzione socket , esiste in uno spazio dei nomi (famiglia di indirizzi), ma non ha un nome assegnato. Usare la funzione di associazione per stabilire l'associazione locale del socket assegnando un nome locale a un socket senza nome.

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.

Nota Quando si utilizza associare con l'opzione socket SO_EXCLUSIVEADDRUSE o SO_REUSEADDR, è necessario impostare l'opzione socket prima di eseguire binding per avere alcun effetto. Per altre informazioni, vedere SO_EXCLUSIVEADDRUSE e Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE.

 

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 non è in genere necessaria per l'invio di operazioni a un gruppo multicast. Il sendto,WSASendMsge funzioni WSASendTo associano implicitamente il socket all'indirizzo con caratteri jolly se il socket non è già associato. La funzione di associazione è necessaria prima dell'uso del inviare o funzioni di WSASend che non eseguono un binding implicito e sono consentite solo sui socket connessi, il che significa che il socket deve essere già stato associato per essere connesso. È possibile usare la funzione di associazione prima di inviare operazioni usando le funzioni sendto,WSASendMsgo WSASendTo funzioni se un'applicazione desidera selezionare un indirizzo IP locale specifico in un computer locale con più interfacce di rete e indirizzi IP locali. In caso contrario, un'associazione implicita all'indirizzo con caratteri jolly usando le funzioni sendto,WSASendMsg o funzioni WSASendTo potrebbe comportare l'uso di un indirizzo IP locale diverso per le operazioni di invio.

Nota Quando si esegue una chiamata Winsock bloccante, ad esempio binding, Winsock potrebbe dover attendere il completamento di un evento di rete. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di procedura asincrona pianificata nello stesso thread. L'esecuzione di un'altra chiamata Winsock bloccante all'interno di un APC che ha interrotto una chiamata Winsock in corso sullo stesso thread comporterà un comportamento non definito e non deve mai essere tentata dai client Winsock.
 

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 usando binding, la funzione di connessione avrà 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 , vedere Introduzione a 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;
}


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

di programmazione multicast

opzioni socket SOL_SOCKET

SO_EXCLUSIVEADDRUSE

socket non elaborati TCP/IP

Uso di SO_REUSEADDR e SO_EXCLUSIVEADDRUSE

WSACancelBlockingCall

Funzioni Winsock

di riferimento winsock

connettere

getsockname

ascoltare

setockopt

sockaddr

socket