Condividi tramite


funzione connect (winsock2.h)

La funzione connect stabilisce una connessione a un socket specificato.

Sintassi

int WSAAPI connect(
  [in] SOCKET         s,
  [in] const sockaddr *name,
  [in] int            namelen
);

Parametri

[in] s

Descrittore che identifica un socket non connesso.

[in] name

Puntatore alla struttura sockaddr a cui deve essere stabilita la connessione.

[in] namelen

Lunghezza, in byte, della struttura sockaddr a cui punta il parametro name .

Valore restituito

Se non si verifica alcun errore, la connessione restituisce zero. In caso contrario, restituisce SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.

In un socket di blocco, il valore restituito indica l'esito positivo o negativo del tentativo di connessione.

Con un socket non bloccante, il tentativo di connessione non può essere completato immediatamente. In questo caso, la connessione restituirà SOCKET_ERROR e WSAGetLastError restituirà WSAEWOULDBLOCK. In questo caso, esistono tre possibili scenari:

  • Usare la funzione select per determinare il completamento della richiesta di connessione controllando se il socket è scrivibile.
  • Se l'applicazione usa WSAAsyncSelect per indicare l'interesse per gli eventi di connessione, l'applicazione riceverà una notifica di FD_CONNECT che indica che l'operazione di connessione è stata completata (correttamente o meno).
  • Se l'applicazione usa WSAEventSelect per indicare l'interesse per gli eventi di connessione, l'oggetto evento associato verrà segnalato che l'operazione di connessione è stata completata (correttamente o meno).

Finché il tentativo di connessione non viene completato su un socket non bloccante, tutte le chiamate successive per la connessione sullo stesso socket avranno esito negativo con il codice di errore WSAEALREADY e WSAEISCONN al termine della connessione. A causa di ambiguità nella versione 1.1 della specifica Windows Sockets, i codici di errore restituiti dalla connessione mentre una connessione è già in sospeso possono variare tra le implementazioni. Di conseguenza, non è consigliabile che le applicazioni usino più chiamate per connettersi per rilevare il completamento della connessione. In tal caso, devono essere preparati a gestire i valori di errore WSAEINVAL e WSAEWOULDBLOCK allo stesso modo in cui gestiscono WSAEALREADY, per garantire un'operazione affidabile.

Se il codice di errore restituito indica che il tentativo di connessione non è riuscito, ovvero WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT, l'applicazione può chiamare di nuovo la connessione per lo stesso socket.

Codice di errore Significato
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEADDRINUSE
L'indirizzo locale del socket è già in uso e il socket non è stato contrassegnato per consentire il riutilizzo degli indirizzi con SO_REUSEADDR. Questo errore si verifica in genere durante l'esecuzione dell'associazione, ma potrebbe essere ritardato fino a quando la funzione di connessionenon è stata associata a un indirizzo con caratteri jolly (INADDR_ANY o in6addr_any) per l'indirizzo IP locale. Un indirizzo specifico deve essere associato in modo implicito dalla funzione connect .
WSAEINTR
La chiamata di Windows Socket 1.1 bloccata è stata annullata tramite WSACancelBlockingCall.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEALREADY
Una chiamata di connessione non bloccante è in corso sul socket specificato.
Nota Per mantenere la compatibilità con le versioni precedenti, questo errore viene segnalato come WSAEINVAL alle applicazioni Windows Sockets 1.1 che si collegano a Winsock.dll o Wsock32.dll.
 
WSAEADDRNOTAVAIL
L'indirizzo remoto non è un indirizzo valido, ad esempio INADDR_ANY o in6addr_any, .
WSAEAFNOSUPPORT
Impossibile utilizzare gli indirizzi della famiglia specificata con questo socket.
WSAECONNREFUSED
Il tentativo di connessione è stato respinto in modo forzato.
WSAEFAULT
La struttura sockaddr a cui punta il nome contiene un formato di indirizzo non corretto per la famiglia di indirizzi associata o il parametro namelen è troppo piccolo. Questo errore viene restituito anche se la struttura sockaddr a cui punta il parametro name con una lunghezza specificata nel parametro namelen non si trova in una parte valida dello spazio indirizzi utente.
WSAEINVAL
Il parametro s è un socket in ascolto.
WSAEISCONN
Il socket è già connesso (solo socket orientati alla connessione).
WSAENETUNREACH
Impossibile raggiungere la rete da questo host in questo momento.
WSAEHOSTUNREACH
Tentativo di operazione del socket verso un host non raggiungibile.
WSAENOBUFS
Nota Non è disponibile spazio buffer. Il socket non può essere connesso.
 
WSAENOTSOCK
Il descrittore specificato nel parametro s non è un socket.
WSAETIMEDOUT
Tentativo di connessione timeout senza stabilire una connessione.
WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e la connessione non può essere completata immediatamente.
WSAEACCES
Tentativo di connessione di un socket di datagrammi all'indirizzo broadcast non riuscito perché l'opzione setsockopt SO_BROADCAST non è abilitata.

Commenti

La funzione connect viene usata per creare una connessione alla destinazione specificata. Se socket s, non è associato, i valori univoci vengono assegnati all'associazione locale dal sistema e il socket viene contrassegnato come associato.

Per i socket orientati alla connessione (ad esempio, digitare SOCK_STREAM), viene avviata una connessione attiva all'host esterno usando il nome (un indirizzo nello spazio dei nomi del socket; per una descrizione dettagliata, vedere bind e sockaddr).

Nota Se viene aperto un socket, viene effettuata una chiamata setsockopt e viene eseguita una chiamata sendto , Windows Sockets esegue una chiamata di funzione di associazione implicita.

 

Al termine della chiamata socket, il socket è pronto per l'invio e la ricezione dei dati. Se il membro dell'indirizzo della struttura specificata dal parametro name viene compilato con zeri, connect restituirà l'errore WSAEADDRNOTAVAIL. Qualsiasi tentativo di riconnessione di una connessione attiva avrà esito negativo con il codice di errore WSAEISCONN.

Per i socket non bloccanti orientati alla connessione, spesso non è possibile completare immediatamente la connessione. In questo caso, questa funzione restituisce l'errore WSAEWOULDBLOCK. Tuttavia, l'operazione procede.

Quando il risultato dell'esito positivo o negativo diventa noto, può essere segnalato in uno dei due modi, a seconda del modo in cui il client esegue la registrazione per la notifica.

  • Se il client usa la funzione select , l'esito positivo viene segnalato nel set writefds e l'errore viene segnalato nel set exceptfds.
  • Se il client usa le funzioni WSAAsyncSelect o WSAEventSelect, la notifica viene annunciata con FD_CONNECT e il codice di errore associato al FD_CONNECT indica l'esito positivo o un motivo specifico per l'errore.

Se la connessione non viene completata immediatamente, il client deve attendere il completamento della connessione prima di tentare di impostare le opzioni socket usando setsockopt. La chiamata a setsockopt mentre è in corso una connessione non è supportata.

Per un socket senza connessione (ad esempio, digitare SOCK_DGRAM), l'operazione eseguita dalla connessione consiste semplicemente nell'stabilire un indirizzo di destinazione predefinito che può essere usato nelle / successive chiamateWSASend eWSARecv/ successive. Gli eventuali datagrammi ricevuti da un indirizzo diverso dall'indirizzo di destinazione specificato verranno eliminati. Se il membro dell'indirizzo della struttura specificata dal nome viene riempito con zeri, il socket verrà disconnesso. Quindi, l'indirizzo remoto predefinito sarà indeterminato, quindi inviare/ WSASend e ricevere/ chiamateWSARecv restituirà il codice di errore WSAENOTCONN. È tuttavia possibile usare sendto/ WSASendTo e recvfrom/ WSARecvFrom . La destinazione predefinita può essere modificata semplicemente chiamando di nuovo la connessione , anche se il socket è già connesso. Gli eventuali datagrammi accodati per la ricevuta vengono eliminati se il nome è diverso dalla connessione precedente.

Per i socket senza connessione, il nome può indicare qualsiasi indirizzo valido, incluso un indirizzo broadcast. Tuttavia, per connettersi a un indirizzo broadcast, un socket deve usare setsockopt per abilitare l'opzione SO_BROADCAST. In caso contrario, la connessione avrà esito negativo con il codice di errore WSAEACCES.

Quando una connessione tra socket viene interrotta, il socket connesso deve essere rimosso e deve essere creato un nuovo socket. Quando si verifica un problema su un socket connesso, l'applicazione deve rimuovere il socket e creare di nuovo il socket per tornare a un punto stabile.

Nota Quando si esegue una chiamata Winsock bloccante, ad esempio la connessione, Winsock potrebbe dover attendere un evento di rete prima che la chiamata possa essere completata. 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 causerà un comportamento non definito e non deve mai essere tentata dai client Winsock.
 

Codice di esempio

Nell'esempio seguente viene illustrato l'uso della funzione connect .
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);

    //----------------------
    // Connect to server.
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}


Per un altro esempio che usa la funzione connect, vedere Introduzione Con Winsock.

Note per i socket IrDA

  • Il file di intestazione Af_irda.h deve essere incluso in modo esplicito.
  • Se viene rilevata una connessione IrDA esistente a livello di accesso multimediale, viene restituito WSAENETDOWN .
  • Se esistono connessioni attive a un dispositivo con un indirizzo diverso, viene restituito WSAEADDRINUSE .
  • Se il socket è già connesso o una modifica della modalità esclusiva/multiplexed non riuscita, viene restituito WSAEISCONN .
  • Se il socket è stato associato in precedenza a un nome di servizio locale per accettare connessioni in ingresso tramite bind, viene restituito WSAEINVAL . Si noti che una volta associato un socket, non può essere usato per stabilire una connessione in uscita.

IrDA implementa la funzione connect con indirizzi del modulo sockaddr_irda. In genere, un'applicazione client creerà un socket con la funzione socket, analizzerà la prossimità immediata per i dispositivi IrDA con l'opzione socket IRLMP_ENUMDEVICES, scegli un dispositivo dall'elenco restituito, formerà un indirizzo e quindi chiamerà la connessione. Non esiste alcuna differenza tra la semantica di blocco e non di blocco.

Requisiti

   
Client minimo supportato Windows Vista [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione winsock2.h
Libreria Ws2_32.lib
DLL Ws2_32.dll

Vedi anche

WSAAsyncSelect

WSAConnect

ConnectEx

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

bind

getsockname

select

sockaddr

Socket