Função connect (winsock2.h)

A função connect estabelece uma conexão com um soquete especificado.

Sintaxe

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

Parâmetros

[in] s

Um descritor que identifica um soquete não conectado.

[in] name

Um ponteiro para a estrutura sockaddr à qual a conexão deve ser estabelecida.

[in] namelen

O comprimento, em bytes, da estrutura sockaddr apontada pelo parâmetro name .

Valor retornado

Se nenhum erro ocorrer, a conexão retornará zero. Caso contrário, ele retornará SOCKET_ERROR e um código de erro específico poderá ser recuperado chamando WSAGetLastError.

Em um soquete de bloqueio, o valor retornado indica êxito ou falha da tentativa de conexão.

Com um soquete sem bloqueio, a tentativa de conexão não pode ser concluída imediatamente. Nesse caso, connect retornará SOCKET_ERROR e WSAGetLastError retornará WSAEWOULDBLOCK. Nesse caso, há três cenários possíveis:

  • Use a função select para determinar a conclusão da solicitação de conexão verificando se o soquete é gravável.
  • Se o aplicativo estiver usando WSAAsyncSelect para indicar interesse em eventos de conexão, o aplicativo receberá uma notificação de FD_CONNECT indicando que a operação de conexão foi concluída (com êxito ou não).
  • Se o aplicativo estiver usando WSAEventSelect para indicar interesse em eventos de conexão, o objeto de evento associado será sinalizado indicando que a operação de conexão foi concluída (com êxito ou não).

Até que a tentativa de conexão seja concluída em um soquete sem bloqueio, todas as chamadas subsequentes para se conectar no mesmo soquete falharão com o código de erro WSAEALREADY e WSAEISCONN quando a conexão for concluída com êxito. Devido a ambiguidades na versão 1.1 da especificação do Windows Sockets, os códigos de erro retornados da conexão enquanto uma conexão já está pendente podem variar entre as implementações. Como resultado, não é recomendável que os aplicativos usem várias chamadas para se conectar para detectar a conclusão da conexão. Se o fizerem, eles deverão estar preparados para lidar com valores de erro WSAEINVAL e WSAEWOULDBLOCK da mesma maneira que lidam com WSAEALREADY, para garantir uma operação robusta.

Se o código de erro retornado indicar que a tentativa de conexão falhou (ou seja, WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT), o aplicativo poderá chamar connect novamente para o mesmo soquete.

Código do erro Significado
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAENETDOWN
O subsistema de rede falhou.
WSAEADDRINUSE
O endereço local do soquete já está em uso e o soquete não foi marcado para permitir a reutilização de endereço com SO_REUSEADDR. Esse erro geralmente ocorre ao executar a associação, mas pode ser adiado até que a função de conexão se a associação fosse a um endereço curinga (INADDR_ANY ou in6addr_any) para o endereço IP local. Um endereço específico precisa ser implicitamente associado pela função connect .
WSAEINTR
A chamada de bloqueio do Windows Socket 1.1 foi cancelada por meio de WSACancelBlockingCall.
WSAEINPROGRESS
Uma chamada de bloqueio do Windows Sockets 1.1 está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEALREADY
Uma chamada de conexão sem bloqueio está em andamento no soquete especificado.
Nota Para preservar a compatibilidade com versões anteriores, esse erro é relatado como WSAEINVAL para aplicativos do Windows Sockets 1.1 que se vinculam a Winsock.dll ou Wsock32.dll.
 
WSAEADDRNOTAVAIL
O endereço remoto não é um endereço válido (como INADDR_ANY ou in6addr_any).
WSAEAFNOSUPPORT
Os endereços na família especificada não podem ser usados com este soquete.
WSAECONNREFUSED
A tentativa de conexão foi rejeitada de modo forçado.
WSAEFAULT
A estrutura sockaddr apontada pelo nome contém um formato de endereço incorreto para a família de endereços associada ou o parâmetro namelen é muito pequeno. Esse erro também será retornado se a estrutura sockaddr apontada pelo parâmetro name com um comprimento especificado no parâmetro namelen não estiver em uma parte válida do espaço de endereço do usuário.
WSAEINVAL
O parâmetro s é um soquete de escuta.
WSAEISCONN
O soquete já está conectado (somente soquetes orientados à conexão).
WSAENETUNREACH
A rede não pode ser alcançada através deste host neste momento.
WSAEHOSTUNREACH
Uma operação de soquete foi tentada em um host inacessível.
WSAENOBUFS
Nota Nenhum espaço em buffer está disponível. O soquete não pode ser conectado.
 
WSAENOTSOCK
O descritor especificado no parâmetro s não é um soquete.
WSAETIMEDOUT
Uma tentativa de conexão atingiu o tempo limite sem estabelecer uma conexão.
WSAEWOULDBLOCK
O soquete é marcado como de não desbloqueio e a conexão não pode ser concluída imediatamente.
WSAEACCES
Falha na tentativa de conectar um soquete de datagrama ao endereço de difusão porque a opção setsockopt SO_BROADCAST não está habilitada.

Comentários

A função connect é usada para criar uma conexão com o destino especificado. Se soquetes forem desassociados, os valores exclusivos serão atribuídos à associação local pelo sistema e o soquete será marcado como associado.

Para soquetes orientados à conexão (por exemplo, digite SOCK_STREAM), uma conexão ativa é iniciada com o host estrangeiro usando o nome (um endereço no namespace do soquete; para obter uma descrição detalhada, consulte bind e sockaddr).

Nota Se um soquete for aberto, uma chamada setsockopt será feita e, em seguida, uma chamada sendto será feita, o Windows Sockets executará uma chamada de função de associação implícita.

 

Quando a chamada de soquete for concluída com êxito, o soquete estará pronto para enviar e receber dados. Se o membro de endereço da estrutura especificada pelo parâmetro name for preenchido com zeros, connect retornará o erro WSAEADDRNOTAVAIL. Qualquer tentativa de reconectar uma conexão ativa falhará com o código de erro WSAEISCONN.

Para soquetes orientados a conexão e sem bloqueio, geralmente não é possível concluir a conexão imediatamente. Nesse caso, essa função retorna o erro WSAEWOULDBLOCK. No entanto, a operação continua.

Quando o resultado de êxito ou falha se torna conhecido, ele pode ser relatado de duas maneiras, dependendo de como o cliente se registra para notificação.

  • Se o cliente usar a função select , o êxito será relatado no conjunto writefds e a falha será relatada no conjunto exceptfds.
  • Se o cliente usar as funções WSAAsyncSelect ou WSAEventSelect, a notificação será anunciada com FD_CONNECT e o código de erro associado ao FD_CONNECT indicará êxito ou um motivo específico para falha.

Se a conexão não for concluída imediatamente, o cliente deverá aguardar a conclusão da conexão antes de tentar definir opções de soquete usando setsockopt. Não há suporte para chamar setsockopt enquanto uma conexão está em andamento.

Para um soquete sem conexão (por exemplo, digite SOCK_DGRAM), a operação executada pela conexão é apenas para estabelecer um endereço de destino padrão que pode ser usado em chamadasWSASend eWSARecv de retransmissão/ / subsequentes. Todos os datagramas recebidos de um endereço diferente do endereço de destino especificado serão descartados. Se o membro de endereço da estrutura especificada pelo nome for preenchido com zeros, o soquete será desconectado. Em seguida, o endereço remoto padrão será indeterminado, portanto, as/ chamadasWSASend e recv/ WSARecv retornarão o código de erro WSAENOTCONN. No entanto, sendto/ WSASendTo e recvfrom/ WSARecvFrom ainda podem ser usados. O destino padrão pode ser alterado simplesmente chamando conectar novamente, mesmo que o soquete já esteja conectado. Todos os datagramas enfileirados para recebimento serão descartados se o nome for diferente da conexão anterior.

Para soquetes sem conexão, o nome pode indicar qualquer endereço válido, incluindo um endereço de difusão. No entanto, para se conectar a um endereço de difusão, um soquete deve usar setsockopt para habilitar a opção SO_BROADCAST. Caso contrário, a conexão falhará com o código de erro WSAEACCES.

Quando uma conexão entre soquetes é interrompida, o soquete que foi conectado deve ser descartado e um novo soquete deve ser criado. Quando um problema se desenvolve em um soquete conectado, o aplicativo deve descartar o soquete e criar o soquete novamente para retornar a um ponto estável.

Nota Ao emitir uma chamada winsock de bloqueio, como conectar, o Winsock pode precisar aguardar um evento de rede antes que a chamada possa ser concluída. O Winsock executa uma espera alertável nessa situação, que pode ser interrompida por uma APC (chamada de procedimento assíncrono) agendada no mesmo thread. A emissão de outra chamada winsock de bloqueio dentro de um APC que interrompeu uma chamada Winsock de bloqueio contínuo no mesmo thread levará a um comportamento indefinido e nunca deve ser tentada por clientes Winsock.
 

Código de exemplo

O exemplo a seguir demonstra o uso da função 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;
}


Para obter outro exemplo que usa a função connect, consulte Introdução With Winsock.

Notas para soquetes IrDA

  • O arquivo de cabeçalho Af_irda.h deve ser incluído explicitamente.
  • Se uma conexão IrDA existente for detectada no nível de acesso à mídia, WSAENETDOWN será retornado.
  • Se houver conexões ativas com um dispositivo com um endereço diferente, WSAEADDRINUSE será retornado.
  • Se o soquete já estiver conectado ou uma alteração de modo exclusivo/multiplexado falhar, WSAEISCONN será retornado.
  • Se o soquete tiver sido anteriormente associado a um nome de serviço local para aceitar conexões de entrada usando bind, WSAEINVAL será retornado. Observe que, depois que um soquete é associado, ele não pode ser usado para estabelecer uma conexão de saída.

O IrDA implementa a função connect com endereços do formulário sockaddr_irda. Normalmente, um aplicativo cliente criará um soquete com a função de soquete, examinará as proximidades imediatas em busca de dispositivos IrDA com a opção de soquete IRLMP_ENUMDEVICES, escolherá um dispositivo na lista retornada, formará um endereço e, em seguida, chamará connect. Não há diferença entre o bloqueio e a semântica semântica de bloqueio.

Requisitos

   
Cliente mínimo com suporte Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho winsock2.h
Biblioteca Ws2_32.lib
DLL Ws2_32.dll

Confira também

WSAAsyncSelect

Wsaconnect

ConnectEx

Funções Winsock

Referência de Winsock

accept

bind

Getsockname

select

Sockaddr

socket