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 |
---|---|
|
A família de endereços não é especificada. |
|
A família de endereços IPv4 (Protocolo de Internet versão 4). |
|
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. |
|
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. |
|
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. |
|
A família de endereços IPv6 (Internet Protocol versão 6). |
|
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. |
|
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 |
---|---|
|
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). |
|
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). |
|
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. |
|
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. |
|
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.
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 |
---|---|
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função. | |
O subsistema de rede ou o provedor de serviços associado falhou. | |
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. | |
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. | |
Nenhum descritor de soquete disponível. | |
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. | |
O provedor de serviços retornou uma versão diferente da 2.2. | |
O provedor de serviços retornou uma tabela de procedimento inválida ou incompleta para o WSPStartup. | |
Nenhum espaço de buffer disponível. O soquete não pode ser criado. | |
Não há suporte para o protocolo especificado. | |
O protocolo especificado é o tipo errado para esse soquete. | |
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. | |
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.
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.
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.
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_IPV6