Função WSASocketW (winsock2.h)
A função WSASocket cria um soquete associado a um provedor de serviços de transporte específico.
Sintaxe
SOCKET WSAAPI WSASocketW(
[in] int af,
[in] int type,
[in] int protocol,
[in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
[in] GROUP g,
[in] DWORD dwFlags
);
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 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.
[in] lpProtocolInfo
Um ponteiro para uma estrutura WSAPROTOCOL_INFO que define as características do soquete a ser criado. Se esse parâmetro não for NULL, o soquete será associado ao provedor associado à estrutura de WSAPROTOCOL_INFO indicada.
[in] g
Uma ID de grupo de soquete existente ou uma ação apropriada a ser tomada ao criar um soquete e um novo grupo de soquetes.
Se g for uma ID de grupo de soquete existente, ingresse o novo soquete nesse grupo de soquetes, desde que todos os requisitos definidos por esse grupo sejam atendidos.
Se g não for uma ID de grupo de soquete existente, os valores a seguir serão possíveis.
[in] dwFlags
Um conjunto de sinalizadores usados para especificar atributos de soquete adicionais.
Uma combinação desses sinalizadores pode ser definida, embora algumas combinações não sejam permitidas.
Valor | Significado |
---|---|
|
Crie um soquete que dê suporte a operações de E/S sobrepostas.
A maioria dos soquetes deve ser criada com esse conjunto de sinalizadores. Soquetes sobrepostos podem utilizar WSASend, WSASendTo, WSARecv, WSARecvFrom e WSAIoctl para operações de E/S sobrepostas, que permitem que várias operações sejam iniciadas e em andamento simultaneamente. Todas as funções que permitem a operação sobreposta (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) também dão suporte ao uso não sobreposto em um soquete sobreposto se os valores para parâmetros relacionados a operações sobrepostas forem NULL. |
|
Crie um soquete que será um c_root em uma sessão de vários pontos.
Esse atributo só será permitido se a estrutura WSAPROTOCOL_INFO para o provedor de transporte que cria o soquete der suporte a um mecanismo multipoint ou multicast e o painel de controle de uma sessão de vários pontos estiver com raiz. Isso seria indicado pelo membro dwServiceFlags1 da estrutura WSAPROTOCOL_INFO com os sinalizadores XP1_SUPPORT_MULTIPOINT e XP1_MULTIPOINT_CONTROL_PLANE definidos. Quando o parâmetro lpProtocolInfo não é NULL, a estrutura WSAPROTOCOL_INFO para o provedor de transporte é apontada pelo parâmetro lpProtocolInfo . Quando o parâmetro lpProtocolInfo é NULL, a estrutura WSAPROTOCOL_INFO é baseada no provedor de transporte selecionado pelos valores especificados para os parâmetros af, type e protocol . Consulte Semântica multiponto e multicast para obter informações adicionais sobre uma sessão de vários pontos. |
|
Crie um soquete que será um c_leaf em uma sessão de vários pontos.
Esse atributo só será permitido se a estrutura WSAPROTOCOL_INFO para o provedor de transporte que cria o soquete der suporte a um mecanismo multipoint ou multicast e o painel de controle de uma sessão de vários pontos não tiver raiz. Isso seria indicado pelo membro dwServiceFlags1 da estrutura WSAPROTOCOL_INFO com o sinalizador XP1_SUPPORT_MULTIPOINT definido e o sinalizador XP1_MULTIPOINT_CONTROL_PLANE não definido. Quando o parâmetro lpProtocolInfo não é NULL, a estrutura WSAPROTOCOL_INFO para o provedor de transporte é apontada pelo parâmetro lpProtocolInfo . Quando o parâmetro lpProtocolInfo é NULL, a estrutura WSAPROTOCOL_INFO é baseada no provedor de transporte selecionado pelos valores especificados para os parâmetros af, type e protocol . Consulte Semântica multiponto e multicast para obter informações adicionais sobre uma sessão de vários pontos. |
|
Crie um soquete que será um d_root em uma sessão de vários pontos.
Esse atributo só será permitido se a estrutura WSAPROTOCOL_INFO para o provedor de transporte que cria o soquete der suporte a um mecanismo multipoint ou multicast e o plano de dados para uma sessão de vários pontos estiver com raiz. Isso seria indicado pelo membro dwServiceFlags1 da estrutura WSAPROTOCOL_INFO com os sinalizadores XP1_SUPPORT_MULTIPOINT e XP1_MULTIPOINT_DATA_PLANE definidos. Quando o parâmetro lpProtocolInfo não é NULL, a estrutura WSAPROTOCOL_INFO para o provedor de transporte é apontada pelo parâmetro lpProtocolInfo . Quando o parâmetro lpProtocolInfo é NULL, a estrutura WSAPROTOCOL_INFO é baseada no provedor de transporte selecionado pelos valores especificados para os parâmetros af, type e protocol . Consulte Semântica multiponto e multicast para obter informações adicionais sobre uma sessão de vários pontos. |
|
Crie um soquete que será um d_leaf em uma sessão de vários pontos.
Esse atributo só será permitido se a estrutura WSAPROTOCOL_INFO para o provedor de transporte que cria o soquete der suporte a um mecanismo multipoint ou multicast e o plano de dados de uma sessão de vários pontos não tiver raiz. Isso seria indicado pelo membro dwServiceFlags1 da estrutura WSAPROTOCOL_INFO com o sinalizador XP1_SUPPORT_MULTIPOINT definido e o sinalizador XP1_MULTIPOINT_DATA_PLANE não definido. Quando o parâmetro lpProtocolInfo não é NULL, a estrutura WSAPROTOCOL_INFO para o provedor de transporte é apontada pelo parâmetro lpProtocolInfo . Quando o parâmetro lpProtocolInfo é NULL, a estrutura WSAPROTOCOL_INFO é baseada no provedor de transporte selecionado pelos valores especificados para os parâmetros af, type e protocol . Consulte Semântica multiponto e multicast para obter informações adicionais sobre uma sessão de vários pontos. |
|
Crie um soquete que permita definir um descritor de segurança no soquete que contém uma SACL (lista de controle de acesso de segurança) em vez de apenas uma DACL (lista de controle de acesso discricionário).
AS SACLs são usadas para gerar auditorias e alarmes quando ocorre um marcar de acesso no objeto. Para um soquete, ocorre um marcar de acesso para determinar se o soquete deve ter permissão para associar a um endereço específico especificado à função de associação. O ACCESS_SYSTEM_SECURITY direito de acesso controla a capacidade de obter ou definir a SACL no descritor de segurança de um objeto. O sistema concede esse direito de acesso somente se o privilégio SE_SECURITY_NAME estiver habilitado no token de acesso do thread solicitante. |
|
Crie um soquete que não seja herdável.
Um identificador de soquete criado pelo WSASocket ou pela função de soquete é herdável por padrão. Quando esse sinalizador é definido, o identificador de soquete não é herdável. A função GetHandleInformation pode ser usada para determinar se um identificador de soquete foi criado com o sinalizador WSA_FLAG_NO_HANDLE_INHERIT definido. A função GetHandleInformation retornará que o valor de HANDLE_FLAG_INHERIT está definido. Esse sinalizador tem suporte no Windows 7 com SP1, Windows Server 2008 R2 com SP1 e posterior |
Retornar valor
Se nenhum erro ocorrer, WSASocket 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 falhou. | |
A família de endereços especificada não tem suporte. | |
O parâmetro lpProtocolInfo não está em uma parte válida do espaço de endereço do processo. | |
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. | |
Esse valor é verdadeiro para qualquer uma das condições a seguir.
|
|
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 descritor de soquete disponível. | |
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 WSASocket faz com que um descritor de soquete e todos os recursos relacionados sejam alocados e associados a um provedor de serviços de transporte. A maioria dos soquetes deve ser criada com o atributo WSA_FLAG_OVERLAPPED definido no parâmetro dwFlags . Um soquete criado com esse atributo dá suporte ao uso de operações de E/S sobrepostas que fornecem maior desempenho. Por padrão, um soquete criado com a função WSASocket não terá esse atributo sobreposto definido. Por outro lado, a função de soquete cria um soquete que dá suporte a operações de E/S sobrepostas como o comportamento padrão.
Se o parâmetro lpProtocolInfo for NULL, Winsock utilizará o primeiro provedor de serviço de transporte disponível que dá suporte à combinação solicitada de família de endereços, tipo de soquete e protocolo especificados nos parâmetros af, type e protocol .
Se o parâmetro lpProtocolInfo não for NULL, o soquete será associado ao provedor associado à estrutura de WSAPROTOCOL_INFO indicada. Nessa instância, o aplicativo pode fornecer a constante de manifesto FROM_PROTOCOL_INFO como o valor de qualquer um dos parâmetros af, type ou protocol . Isso indica que os valores correspondentes da estrutura de WSAPROTOCOL_INFO indicada (iAddressFamily, iSocketType, iProtocol) devem ser assumidos. De qualquer forma, os valores especificados para af, tipo e protocolo são passados sem modificação para o provedor de serviços de transporte.
Ao selecionar um protocolo e seu provedor de serviços de suporte com base em af, tipo e protocolo, 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.
Se um soquete for criado usando a função WSASocket , o parâmetro dwFlags deverá ter o atributo WSA_FLAG_OVERLAPPED definido para que as opções de soquete SO_RCVTIMEO ou SO_SNDTIMEO funcionem corretamente. Caso contrário, o tempo limite nunca entrará em vigor no soquete.
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 neles. Uma conexão com um soquete especificado é estabelecida com uma chamada de função connect ou WSAConnect . Depois de conectados, os dados podem ser transferidos usando as chamadasWSASend/ e recv/WSARecv. Quando uma sessão for concluída, a função closesocket deverá ser chamada para liberar os recursos associados ao soquete. Para soquetes orientados à conexão, a função de desligamento deve ser chamada para interromper a transferência de dados no soquete antes de chamar a função closesocket .
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/WSASendTo e revfrom/WSARecvFrom. Se esse soquete estiver conectado a um par específico, os datagramas poderão ser enviados para esse par usando send/WSASend e poderão ser recebidos desse par (somente) usando o recv/WSARecv.
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 sempre que possível.
A função WSASocket pode ser usada para criar um soquete a ser usado por um serviço para que, se outro soquete tentar associar à mesma porta usada pelo serviço, o registro de auditoria seja gerado. Para habilitar essa opção, um aplicativo precisaria fazer o seguinte:
- Chame a função AdjustTokenPrivileges para habilitar o privilégio SE_SECURITY_NAME no token de acesso para o processo. Esse privilégio é necessário para definir os direitos de acesso ACCESS_SYSTEM_SECURITY no descritor de segurança para um objeto .
- Chame a função WSASocket para criar um soquete com dwFlag com a opção WSA_FLAG_ACCESS_SYSTEM_SECURITY definida. A função WSASocket falhará se a função AdjustTokenPrivileges não for chamada primeiro para habilitar o privilégio SE_SECURITY_NAME necessário para essa operação.
- Chame a função SetSecurityInfo para definir um descritor de segurança com uma SACL (Lista de Controle de Acesso do Sistema) no soquete. O identificador de soquete retornado pela função WSASocket é passado no parâmetro handle . Se a função for bem-sucedida, isso definirá o acesso ACCESS_SYSTEM_SECURITY diretamente no descritor de segurança para o soquete.
- Chame a função bind para associar o soquete a uma porta específica. Se a função de associação for bem-sucedida, uma entrada de auditoria será gerada se outro soquete tentar associar à mesma porta.
- Chame a função AdjustTokenPrivileges para remover o privilégio SE_SECURITY_NAME no token de acesso para o processo, pois isso não é mais necessário.
Para obter mais informações sobre ACCESS_SYSTEM_SECURITY, consulte Geraçãode acesso e auditoria do SACL na documentação de autorização.
Grupos de soquetes
O WinSock 2 introduziu a noção de um grupo de soquetes como um meio para um aplicativo ou conjunto de aplicativos de cooperação, para indicar a um provedor de serviços subjacente que um determinado conjunto de soquetes está relacionado e que o grupo, portanto, formado tem determinados atributos. Os atributos de grupo incluem prioridades relativas dos soquetes individuais dentro do grupo e uma qualidade de grupo de especificação de serviço.Aplicativos que precisam trocar fluxos multimídia pela rede são um exemplo em que ser capaz de estabelecer uma relação específica entre um conjunto de soquetes pode ser benéfico. Cabe ao transporte sobre como tratar grupos de soquetes.
As funções WSASocket e WSAAccept podem ser usadas para criar e ingressar explicitamente em um grupo de soquetes ao criar um novo soquete. A ID do grupo de soquetes para um soquete pode ser recuperada usando a função getsockopt com o parâmetro de nível definido como SOL_SOCKET e o parâmetro optname definido como SO_GROUP_ID. Um grupo de soquetes e sua ID de grupo de soquete associado permanecem válidos até que o último soquete pertencente a esse grupo de soquetes seja fechado. As IDs de grupo de soquete são exclusivas em todos os processos para um determinado provedor de serviços. Um grupo de soquetes de zero indica que o soquete não é membro de um grupo de soquetes.
A prioridade de grupo relativo de um grupo de soquetes pode ser acessada usando a função getsockopt com o parâmetro de nível definido como SOL_SOCKET e o parâmetro optname definido como SO_GROUP_PRIORITY. A prioridade de grupo relativo de um grupo de soquetes pode ser definida usando setsockopt com o parâmetro de nível definido como SOL_SOCKET e o parâmetro optname definido como SO_GROUP_PRIORITY.
O provedor Winsock incluído no Windows permite a criação de grupos de soquetes e impõe o SG_CONSTRAINED_GROUP. Todos os soquetes em um grupo de soquetes restritos devem ser criados com o mesmo valor para os parâmetros de tipo e protocolo . Um grupo de soquetes restrito pode consistir apenas em soquetes orientados à conexão e requer que as conexões em todos os soquetes agrupados estejam no mesmo endereço no mesmo host. Essa é a única restrição aplicada a um grupo de soquetes pelo provedor Winsock incluído no Windows. A prioridade do grupo de soquetes não é usada atualmente pelo provedor Winsock ou pela pilha TCP/IP incluída no Windows.
Código de exemplo
O exemplo a seguir demonstra o uso da função WSASocket .#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;
DWORD dwFlags = 0;
// Validate the parameters
if (argc != 5) {
wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
wprintf(L" opens a socket for the specified family, type, protocol, and flags\n");
wprintf(L" flags value must be in decimal, not hex\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws 0 2 17 1\n", argv[0]);
wprintf(L" where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
return 1;
}
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
dwFlags = _wtoi(argv[4]);
// 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);
wprintf(L" Flags = ");
if (dwFlags & WSA_FLAG_OVERLAPPED)
wprintf(L" WSA_FLAG_OVERLAPPED");
if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
wprintf(L" WSA_FLAG_MULTIPOINT_C_ROOT");
if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
wprintf(L" WSA_FLAG_MULTIPOINT_C_LEAF");
if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
wprintf(L" WSA_FLAG_MULTIPOINT_D_ROOT");
if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
wprintf(L" WSA_FLAG_MULTIPOINT_D_LEAF");
if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
wprintf(L" WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT
if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
wprintf(L" WSA_FLAG_NO_HANDLE_INHERIT");
#endif
wprintf(L" (0x%x)\n" , dwFlags);
sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
if (sock == INVALID_SOCKET)
wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"WSASocket 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 function zfailed with error = %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
}
WSACleanup();
return 0;
}
Windows Phone 8: a função WSASocketW tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.
Windows 8.1 e Windows Server 2012 R2: a função WSASocketW tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posterior.
Observação
O cabeçalho winsock2.h define WSASocket como um alias que seleciona automaticamente a versão ANSI ou Unicode dessa função com base na definição da constante de pré-processador UNICODE. Misturar o uso do alias neutro de codificação com código que não seja neutro em codificação pode levar a incompatibilidades que resultam em erros de compilação ou de runtime. Para obter mais informações, consulte Convenções para protótipos de função.
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 |