Função socket (winsock2.h)

A função de soquete cria um soquete associado a um provedor de serviços de transporte específico.

Sintaxe

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

Parâmetros

[in] af

A especificação da família de endereços. Os valores possíveis para a família de endereços são definidos no arquivo de cabeçalho Winsock2.h .

Na SDK do Windows lançada para o Windows Vista e posteriores, a organização dos arquivos de cabeçalho foi alterada e os valores possíveis para a família de endereços são definidos no arquivo de cabeçalho Ws2def.h. Observe que o arquivo de cabeçalho Ws2def.h é incluído automaticamente em Winsock2.h e nunca deve ser usado diretamente.

Os valores atualmente compatíveis são AF_INET ou AF_INET6, que são os formatos da família de endereços da Internet para IPv4 e IPv6. Outras opções para a família de endereços (AF_NETBIOS para uso com NetBIOS, por exemplo) têm suporte se um provedor de serviços do Windows Sockets para a família de endereços estiver instalado. Observe que os valores para a família de endereços AF_ e as constantes da família de protocolos PF_ são idênticos (por exemplo, AF_INET e PF_INET), para que qualquer constante possa ser usada.

A tabela a seguir lista valores comuns para a família de endereços, embora muitos outros valores sejam possíveis.

Af Significado
AF_UNSPEC
0
A família de endereços não é especificada.
AF_INET
2
A família de endereços IPv4 (Protocolo de Internet versão 4).
AF_IPX
6
A família de endereços IPX/SPX. Essa família de endereços só terá suporte se o protocolo NWLink IPX/SPX NetBIOS Compatible Transport estiver instalado.

Não há suporte para essa família de endereços no Windows Vista e posteriores.

AF_APPLETALK
16
A família de endereços AppleTalk. Essa família de endereços só terá suporte se o protocolo AppleTalk estiver instalado.

Não há suporte para essa família de endereços no Windows Vista e posteriores.

AF_NETBIOS
17
A família de endereços NetBIOS. Essa família de endereços só terá suporte se o provedor de Soquetes do Windows para NetBIOS estiver instalado.

O provedor do Windows Sockets para NetBIOS tem suporte em versões de 32 bits do Windows. Esse provedor é instalado por padrão em versões de 32 bits do Windows.

O provedor windows sockets para NetBIOS não tem suporte em versões de 64 bits do windows, incluindo Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 ou Windows XP.

O provedor do Windows Sockets para NetBIOS só dá suporte a soquetes em que o parâmetro de tipo é definido como SOCK_DGRAM.

O provedor do Windows Sockets para NetBIOS não está diretamente relacionado à interface de programação NetBIOS . Não há suporte para a interface de programação NetBIOS no Windows Vista, no Windows Server 2008 e posterior.

AF_INET6
23
A família de endereços IPv6 (Internet Protocol versão 6).
AF_IRDA
26
A família de endereços irda (Associação de Dados Infravermelhos).

Essa família de endereços só terá suporte se o computador tiver uma porta infravermelha e um driver instalados.

AF_BTH
32
A família de endereços Bluetooth.

Essa família de endereços terá suporte no Windows XP com SP2 ou posterior se o computador tiver um adaptador Bluetooth e um driver instalados.

[in] type

A especificação de tipo para o novo soquete.

Os valores possíveis para o tipo de soquete são definidos no arquivo de cabeçalho Winsock2.h .

A tabela a seguir lista os valores possíveis para o parâmetro de tipo com suporte para Windows Sockets 2:

Type Significado
SOCK_STREAM
1
Um tipo de soquete que fornece fluxos de bytes sequenciados, confiáveis, bidirecionais baseados em conexão com um mecanismo de transmissão de dados OOB. Esse tipo de soquete usa o Protocolo de Controle de Transmissão (TCP) para a família de endereços da Internet (AF_INET ou AF_INET6).
SOCK_DGRAM
2
Um tipo de soquete que dá suporte a datagramas, que são buffers sem conexão e não confiáveis de um comprimento máximo fixo (normalmente pequeno). Esse tipo de soquete usa o UDP (User Datagram Protocol) para a família de endereços da Internet (AF_INET ou AF_INET6).
SOCK_RAW
3
Um tipo de soquete que fornece um soquete bruto que permite que um aplicativo manipule o próximo cabeçalho de protocolo de camada superior. Para manipular o cabeçalho IPv4, a opção de soquete IP_HDRINCL deve ser definida no soquete. Para manipular o cabeçalho IPv6, a opção de soquete IPV6_HDRINCL deve ser definida no soquete.
SOCK_RDM
4
Um tipo de soquete que fornece um datagrama de mensagem confiável. Um exemplo desse tipo é a implementação do protocolo multicast PGM (Pragmática Geral Multicast) no Windows, geralmente conhecida como programação multicast confiável.

Esse valor de tipo só terá suporte se o Reliable Multicast Protocol estiver instalado.

SOCK_SEQPACKET
5
Um tipo de soquete que fornece um pacote pseudo-fluxo com base em datagramas.
 

No Windows Sockets 2, novos tipos de soquete foram introduzidos. Um aplicativo pode descobrir dinamicamente os atributos de cada protocolo de transporte disponível por meio da função WSAEnumProtocols . Portanto, um aplicativo pode determinar as possíveis opções de tipo de soquete e protocolo para uma família de endereços e usar essas informações ao especificar esse parâmetro. As definições de tipo de soquete nos arquivos de cabeçalho Winsock2.h e Ws2def.h serão atualizadas periodicamente conforme novos tipos de soquete, famílias de endereços e protocolos são definidos.

No Windows Sockets 1.1, os únicos tipos de soquete possíveis são SOCK_DGRAM e SOCK_STREAM.

[in] protocol

O protocolo a ser usado. As opções possíveis para o parâmetro de protocolo são específicas para a família de endereços e o tipo de soquete especificados. Os valores possíveis para o protocolo são definidos nos arquivos de cabeçalho Winsock2.h e Wsrm.h .

No SDK do Windows lançado para o Windows Vista e posterior, a organização dos arquivos de cabeçalho foi alterada e esse parâmetro pode ser um dos valores do tipo de enumeração IPPROTO definido no arquivo de cabeçalho Ws2def.h. Observe que o arquivo de cabeçalho Ws2def.h é incluído automaticamente em Winsock2.h e nunca deve ser usado diretamente.

Se um valor de 0 for especificado, o chamador não deseja especificar um protocolo e o provedor de serviços escolherá o protocolo a ser usado.

Quando o parâmetro af é AF_INET ou AF_INET6 e o tipo é SOCK_RAW, o valor especificado para o protocolo é definido no campo de protocolo do cabeçalho de pacote IPv6 ou IPv4.

A tabela a seguir lista valores comuns para o protocolo , embora muitos outros valores sejam possíveis.

protocolo Significado
IPPROTO_ICMP
1
O Protocolo de Mensagem de Controle da Internet (ICMP). Esse é um valor possível quando o parâmetro af é AF_UNSPEC, AF_INET ou AF_INET6 e o parâmetro de tipo é SOCK_RAW ou não especificado.

Esse valor de protocolo tem suporte no Windows XP e posterior.

IPPROTO_IGMP
2
O Protocolo de Gerenciamento de Grupos da Internet (IGMP). Esse é um valor possível quando o parâmetro af é AF_UNSPEC, AF_INET ou AF_INET6 e o parâmetro de tipo é SOCK_RAW ou não especificado.

Esse valor de protocolo tem suporte no Windows XP e posterior.

BTHPROTO_RFCOMM
3
O protocolo Bluetooth RADIO FREQUENCY Communications (Bluetooth RFCOMM). Esse é um valor possível quando o parâmetro af é AF_BTH e o parâmetro de tipo é SOCK_STREAM.

Esse valor de protocolo tem suporte no Windows XP com SP2 ou posterior.

IPPROTO_TCP
6
O Protocolo de Controle de Transmissão (TCP). Esse é um valor possível quando o parâmetro af é AF_INET ou AF_INET6 e o parâmetro de tipo é SOCK_STREAM.
IPPROTO_UDP
17
O UDP (Protocolo de Datagrama do Usuário). Esse é um valor possível quando o parâmetro af é AF_INET ou AF_INET6 e o parâmetro de tipo é SOCK_DGRAM.
IPPROTO_ICMPV6
58
O Protocolo de Mensagem de Controle da Internet versão 6 (ICMPv6). Esse é um valor possível quando o parâmetro af é AF_UNSPEC, AF_INET ou AF_INET6 e o parâmetro de tipo é SOCK_RAW ou não especificado.

Esse valor de protocolo tem suporte no Windows XP e posterior.

IPPROTO_RM
113
O protocolo PGM para multicast confiável. Esse é um valor possível quando o parâmetro af é AF_INET e o parâmetro de tipo é SOCK_RDM. No SDK do Windows lançado para o Windows Vista e posterior, esse protocolo também é chamado de IPPROTO_PGM.

Esse valor de protocolo só terá suporte se o Reliable Multicast Protocol estiver instalado.

Retornar valor

Se nenhum erro ocorrer, o soquete retornará um descritor referenciando o novo soquete. Caso contrário, um valor de INVALID_SOCKET é retornado e um código de erro específico pode ser recuperado chamando WSAGetLastError.

Código do erro Significado
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAENETDOWN
O subsistema de rede ou o provedor de serviços associado falhou.
WSAEAFNOSUPPORT
A família de endereços especificada não tem suporte. Por exemplo, um aplicativo tentou criar um soquete para a família de endereços AF_IRDA , mas um adaptador infravermelho e um driver de dispositivo não estão instalados no computador local.
WSAEINPROGRESS
Uma chamada do Windows Sockets 1.1 de bloqueio está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada.
WSAEMFILE
Nenhum descritor de soquete disponível.
WSAEINVAL
Foi fornecido um argumento inválido. Esse erro será retornado se o parâmetro af estiver definido como AF_UNSPEC e o tipo e o parâmetro de protocolo não forem especificados.
WSAEINVALIDPROVIDER
O provedor de serviços retornou uma versão diferente da 2.2.
WSAEINVALIDPROCTABLE
O provedor de serviços retornou uma tabela de procedimento inválida ou incompleta para o WSPStartup.
WSAENOBUFS
Nenhum espaço de buffer disponível. O soquete não pode ser criado.
WSAEPROTONOSUPPORT
Não há suporte para o protocolo especificado.
WSAEPROTOTYPE
O protocolo especificado é o tipo errado para esse soquete.
WSAEPROVIDERFAILEDINIT
Falha ao inicializar o provedor de serviços. Esse erro será retornado se um provedor de serviços em camadas (LSP) ou um provedor de namespace tiver sido instalado incorretamente ou o provedor não funcionar corretamente.
WSAESOCKTNOSUPPORT
O suporte para o tipo de soquete especificado não tem suporte nessa família de endereços.

Comentários

A função de soquete faz com que um descritor de soquete e todos os recursos relacionados sejam alocados e associados a um provedor de serviço de transporte específico. O Winsock utilizará o primeiro provedor de serviços disponível que dá suporte à combinação solicitada de família de endereços, tipo de soquete e parâmetros de protocolo. O soquete criado terá o atributo sobreposto como padrão. Para o Windows, a opção de soquete específica da Microsoft, SO_OPENTYPE, definida em Mswsock.h pode afetar esse padrão. Consulte a documentação específica da Microsoft para obter uma descrição detalhada do SO_OPENTYPE.

Soquetes sem o atributo sobreposto podem ser criados usando WSASocket. Todas as funções que permitem a operação sobreposta (WSASend, WSARecv, WSASendTo, WSARecvFrom e WSAIoctl) também dão suporte ao uso não sobreposto em um soquete sobreposto se os valores para parâmetros relacionados à operação sobreposta forem NULL.

Ao selecionar um protocolo e seu provedor de serviços de suporte, esse procedimento escolherá apenas um protocolo base ou uma cadeia de protocolos, não uma camada de protocolo por si só. As camadas de protocolo não armazenadas não são consideradas com correspondências parciais no tipo ou af . Ou seja, eles não levam a um código de erro de WSAEAFNOSUPPORT ou WSAEPROTONOSUPPORT se nenhum protocolo adequado for encontrado.

Nota A constante de manifesto AF_UNSPEC continua a ser definida no arquivo de cabeçalho, mas seu uso é fortemente desencorajado, pois isso pode causar ambiguidade na interpretação do valor do parâmetro de protocolo .
 
Os aplicativos são incentivados a usar AF_INET6 para o parâmetro af e criar um soquete de modo duplo que pode ser usado com IPv4 e IPv6.

Soquetes orientados à conexão, como SOCK_STREAM fornecem conexões completas duplex e devem estar em um estado conectado antes que qualquer dado possa ser enviado ou recebido nele. Uma conexão com outro soquete é criada com uma chamada de conexão . Depois de conectados, os dados podem ser transferidos usando chamadas de envio e retransmissão . Quando uma sessão for concluída, um closesocket deverá ser executado.

Os protocolos de comunicação usados para implementar um soquete confiável orientado à conexão garantem que os dados não sejam perdidos ou duplicados. Se os dados para os quais o protocolo par tiver espaço de buffer não puderem ser transmitidos com êxito em um período razoável de tempo, a conexão será considerada interrompida e as chamadas subsequentes falharão com o código de erro definido como WSAETIMEDOUT.

Soquetes orientados a mensagens sem conexão permitem o envio e o recebimento de datagramas de e para pares arbitrários usando sendto e recvfrom. Se esse soquete estiver conectado a um par específico, os datagramas poderão ser enviados para esse par usando send e poderão ser recebidos somente desse par usando recv.

IPv6 e IPv4 operam de forma diferente ao receber um soquete com um tipo de SOCK_RAW. O pacote de recebimento IPv4 inclui o conteúdo do pacote, o próximo cabeçalho de nível superior (por exemplo, o cabeçalho IP de um pacote TCP ou UDP) e o cabeçalho de pacote IPv4. O pacote de recebimento IPv6 inclui o conteúdo do pacote e o próximo cabeçalho de nível superior. O pacote de recebimento IPv6 nunca inclui o cabeçalho de pacote IPv6.

Nota Em Windows NT, o suporte a soquete bruto requer privilégios administrativos.
 
Um soquete com um parâmetro de tipo de SOCK_SEQPACKET é baseado em datagramas, mas funciona como um protocolo pseudo-fluxo. Para os pacotes de envio e recebimento, são usados datagramas separados. No entanto, os Soquetes do Windows podem unir vários pacotes de recebimento em um único pacote. Portanto, um aplicativo pode emitir uma chamada de recebimento (por exemplo, recv ou WSARecvEx) e recuperar os dados de vários pacotes unidos em uma única chamada. A família de endereços AF_NETBIOS dá suporte a um parâmetro de tipo de SOCK_SEQPACKET.

Quando o parâmetro af é AF_NETBIOS para NetBIOS por TCP/IP, o parâmetro de tipo pode ser SOCK_DGRAM ou SOCK_SEQPACKET. Para a família de endereços AF_NETBIOS , o parâmetro de protocolo é o número do adaptador lan representado como um número negativo.

No Windows XP e posterior, o comando a seguir pode ser usado para listar o catálogo do Windows Sockets para determinar os provedores de serviços instalados e a família de endereços, o tipo de soquete e os protocolos com suporte.

netsh winsock show catalog

O suporte para soquetes com tipo SOCK_RAW não é necessário, mas os provedores de serviços são incentivados a dar suporte a soquetes brutos como praticáveis.

Notas sobre soquetes IrDA

Lembre-se:
  • O arquivo de cabeçalho Af_irda.h deve ser incluído explicitamente.
  • Há suporte apenas para SOCK_STREAM ; o tipo de SOCK_DGRAM não é suportado pelo IrDA.
  • O parâmetro de protocolo é sempre definido como 0 para IrDA.
Um soquete para uso com a família de endereços AF_IRDA só poderá ser criado se o computador local tiver uma porta infravermelha e um driver instalados. Caso contrário, uma chamada para a função de soquete com o parâmetro af definido como AF_IRDA falhará e WSAGetLastError retornará WSAEPROTONOSUPPORT.

Código de exemplo

O exemplo a seguir demonstra o uso da função de soquete para criar um soquete associado a um provedor de serviços de transporte específico.
#ifndef UNICODE
#define UNICODE 1
#endif

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

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;

    // Validate the parameters
    if (argc != 4) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
        wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    sock = socket(iFamily, iType, iProtocol);
    if (sock == INVALID_SOCKET) 
        wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"socket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket failed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }

    WSACleanup();

    return 0;
}


Windows Phone 8: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.

Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8.1, 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

Opções de soquete IPPROTO_IP

Opções de soquete IPPROTO_IPV6

Programação multicast confiável

Wsasocket

Funções Winsock

Referência de Winsock

accept

bind

Closesocket

connect

Getsockname

Getsockopt

Ioctlsocket

listen

Recv

Recvfrom

select

send

Sendto

Setsockopt

shutdown