Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Classe
Representa um Windows Socket, que é um ponto de extremidade de comunicação de rede.
Sintaxe
class CAsyncSocket : public CObject
Membros
Construtores públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::CAsyncSocket |
Constrói um objeto CAsyncSocket. |
Métodos públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::Accept |
Aceita uma conexão no soquete. |
CAsyncSocket::AsyncSelect |
Solicita notificação de evento para o soquete. |
CAsyncSocket::Attach |
Anexa um identificador de soquete a um objeto CAsyncSocket. |
CAsyncSocket::Bind |
Associa um endereço local ao soquete. |
CAsyncSocket::Close |
Fecha o soquete. |
CAsyncSocket::Connect |
Estabelece uma conexão com o soquete de par. |
CAsyncSocket::Create |
Cria um soquete. |
CAsyncSocket::CreateEx |
Cria um soquete com opções avançadas. |
CAsyncSocket::Detach |
Desanexa um identificador de soquete de um objeto CAsyncSocket. |
CAsyncSocket::FromHandle |
Retorna um ponteiro para um objeto CAsyncSocket, dado um identificador de soquete. |
CAsyncSocket::GetLastError |
Obtém o status de erro da última operação que falhou. |
CAsyncSocket::GetPeerName |
Obtém o endereço do soquete par ao qual o soquete está conectado. |
CAsyncSocket::GetPeerNameEx |
Obtém o endereço do soquete par ao qual o soquete está conectado (manipula endereços IPv6). |
CAsyncSocket::GetSockName |
Obtém o nome local de um soquete. |
CAsyncSocket::GetSockNameEx |
Obtém o nome local de um soquete (manipula endereços IPv6). |
CAsyncSocket::GetSockOpt |
Recupera uma opção de soquete. |
CAsyncSocket::IOCtl |
Controla o modo do soquete. |
CAsyncSocket::Listen |
Estabelece um soquete para escutar solicitações de conexão de entrada. |
CAsyncSocket::Receive |
Recebe dados do soquete. |
CAsyncSocket::ReceiveFrom |
Recebe um datagrama e armazena o endereço de origem. |
CAsyncSocket::ReceiveFromEx |
Recebe um datagram e armazena o endereço de origem (manipula endereços IPv6). |
CAsyncSocket::Send |
Envia dados para um soquete conectado. |
CAsyncSocket::SendTo |
Envia dados para um destino específico. |
CAsyncSocket::SendToEx |
Envia dados para um destino específico (manipula endereços IPv6). |
CAsyncSocket::SetSockOpt |
Define uma opção de soquete. |
CAsyncSocket::ShutDown |
Desabilita Send e/ou chamadas Receive no soquete. |
CASyncSocket::Socket |
Aloca um identificador de soquete. |
Métodos protegidos
| Nome | Descrição |
|---|---|
CAsyncSocket::OnAccept |
Notifica um soquete de escuta de que ele pode aceitar solicitações de conexão pendentes chamando Accept. |
CAsyncSocket::OnClose |
Notifica um soquete de que o soquete conectado a ele fechou. |
CAsyncSocket::OnConnect |
Notifica um soquete de conexão de que a tentativa de conexão foi concluída, seja com êxito ou em erro. |
CAsyncSocket::OnOutOfBandData |
Notifica um soquete de recebimento de que há dados fora de banda a serem lidos no soquete, geralmente uma mensagem urgente. |
CAsyncSocket::OnReceive |
Notifica um soquete de escuta de que há dados a serem recuperados chamando Receive. |
CAsyncSocket::OnSend |
Notifica um soquete de que ele pode enviar dados chamando Send. |
Operadores públicos
| Nome | Descrição |
|---|---|
| CAsyncSocket::operator = | Atribui um novo valor a um objeto CAsyncSocket. |
| CAsyncSocket::operator SOCKET | Use esse operador para recuperar o identificador SOCKET do objeto CAsyncSocket. |
Membros de Dados Públicos
| Nome | Descrição |
|---|---|
CAsyncSocket::m_hSocket |
Indica o identificador SOCKET anexado a esse objeto CAsyncSocket. |
Comentários
A classe CAsyncSocket encapsula a API do Windows Socket Functions, fornecendo uma abstração orientada a objeto para programadores que desejam usar o Windows Sockets em conjunto com o MFC.
Essa classe baseia-se na suposição de que você entende as comunicações de rede. Você é responsável por lidar com bloqueios, diferenças de ordem de bytes e conversões entre cadeias de caracteres Unicode e MBCS (conjunto de caracteres multibyte). Se você quiser uma interface mais conveniente que gerencie esses problemas para você, consulte a classe CSocket.
Para usar um objeto CAsyncSocket, chame seu construtor e, em seguida, chame a função Create para criar o identificador de soquete subjacente (tipo SOCKET), exceto em soquetes aceitos. Para um soquete de servidor, chame a função de membro Listen e, para um soquete do cliente, chame a função de membro Connect. O soquete do servidor deve chamar a função Accept ao receber uma solicitação de conexão. Use as funções CAsyncSocket restantes para realizar comunicações entre soquetes. Após a conclusão, destrua o objeto CAsyncSocket se ele tiver sido criado no heap; o destruidor chama automaticamente a função Close. O tipo de dados SOCKET é descrito no artigo Windows Sockets: Segundo plano.
Observação
Ao usar soquetes MFC em threads secundários em um aplicativo MFC vinculado estaticamente, você deve chamar AfxSocketInit em cada thread que usa soquetes para inicializar as bibliotecas de soquete. Por padrão, AfxSocketInit é chamado somente no thread primário.
Para obter mais informações, consulte Windows Sockets: usando a classe CAsyncSocket e artigos relacionados, bem como a API do Windows Sockets 2.
Hierarquia de herança
CAsyncSocket
Requisitos
Cabeçalho: afxsock.h
CAsyncSocket::Accept
Chame essa função de membro para aceitar uma conexão em um soquete.
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
Parâmetros
rConnectedSocket
Uma referência que identifica um novo soquete disponível para conexão.
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que recebe o endereço do soquete de conexão, como conhecido na rede. O formato exato do argumento lpSockAddr é determinado pela família de endereços estabelecida quando o soquete foi criado. Se lpSockAddr e/ou lpSockAddrLen forem iguais a NULL, nenhuma informação sobre o endereço remoto do soquete aceito será retornada.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr, em bytes. O lpSockAddrLen é um parâmetro de valor-resultado: ele deve inicialmente conter a quantidade de espaço apontada por lpSockAddr; no retorno, ele conterá o comprimento real (em bytes) do endereço retornado.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLené muito pequeno (menor que o tamanho de uma estruturaSOCKADDR).WSAEINPROGRESSUma chamada de Bloqueio do Windows Sockets está em andamento.WSAEINVALListennão foi invocado antes de ser aceito.WSAEMFILEA fila está vazia após a entrada a ser aceita e não há descritores disponíveis.WSAENOBUFSNenhum espaço de buffer disponível.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPO soquete referenciado não é um tipo que dá suporte ao serviço orientado à conexão.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e nenhuma conexão está presente para ser aceita.
Comentários
Essa rotina extrai a primeira conexão na fila de conexões pendentes, cria um novo soquete com as mesmas propriedades desse soquete e o anexa a rConnectedSocket. Se nenhuma conexão pendente estiver presente na fila, Accept retornará zero e GetLastError retornará um erro. O soquete aceito (rConnectedSocket) não pode ser usado para aceitar mais conexões. O soquete original permanece aberto e escutando.
O argumento lpSockAddr é um parâmetro de resultado que é preenchido com o endereço do soquete de conexão, como conhecido pela camada de comunicações.
Accept é usado com tipos de soquete baseados em conexão, como SOCK_STREAM.
CAsyncSocket::AsyncSelect
Chame essa função de membro para solicitar uma notificação de evento para um soquete.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede em que o aplicativo está interessado.
FD_READDeseja receber uma notificação de preparação para leitura.FD_WRITEDeseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.FD_OOBDeseja receber uma notificação da chegada de dados fora da banda.FD_ACCEPTDeseja receber uma notificação de conexões de entrada.FD_CONNECTDeseja receber a notificação dos resultados da conexão.FD_CLOSEDeseja receber uma notificação quando um soquete tiver sido fechado por um par.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVALIndica que um dos parâmetros especificados era inválido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.
Comentários
Essa função é usada para especificar quais funções de notificação de retorno de chamada MFC serão chamadas para o soquete.
AsyncSelect define automaticamente esse soquete como modo de não desbloqueio. Para obter mais informações, consulte o artigo Windows Sockets: notificações de soquete.
CAsyncSocket::Attach
Chame essa função de membro para anexar o identificador hSocket a um objeto CAsyncSocket.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
hSocket
Contém um identificador de um soquete.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede em que o aplicativo está interessado.
FD_READDeseja receber uma notificação de preparação para leitura.FD_WRITEDeseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.FD_OOBDeseja receber uma notificação da chegada de dados fora da banda.FD_ACCEPTDeseja receber uma notificação de conexões de entrada.FD_CONNECTDeseja receber a notificação dos resultados da conexão.FD_CLOSEDeseja receber uma notificação quando um soquete tiver sido fechado por um par.
Valor de retorno
Diferente de zero se a função for bem-sucedida.
Comentários
O identificador SOCKET é armazenado no membro de dados do objeto m_hSocket.
CAsyncSocket::Bind
Chame essa função de membro para associar um endereço local ao soquete.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parâmetros
nSocketPort
A porta que identifica o aplicativo de soquete.
lpszSocketAddress
O endereço de rede, um número separado por pontos, como "128.56.22.8". Passar a cadeia de caracteres NULL para esse parâmetro indica que a instância CAsyncSocket deve escutar a atividade do cliente em todos os interfaces de rede.
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que contém o endereço a ser atribuído a esse soquete.
nSockAddrLen
O comprimento do endereço em lpSockAddr, em bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. A lista a seguir aborda alguns dos erros que podem ser retornados. Para obter uma lista completa, consulte Códigos de erro do Windows Sockets.
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSEO endereço especificado já está sendo usado. (Consulte a opção de soqueteSO_REUSEADDRemSetSockOpt.)WSAEFAULTO argumentonSockAddrLené muito pequeno (menor que o tamanho de uma estruturaSOCKADDR).WSAEINPROGRESSUma chamada de Bloqueio do Windows Sockets está em andamento.WSAEAFNOSUPPORTA família de endereços especificada não tem suporte nessa porta.WSAEINVALO soquete já está associado a um endereço.WSAENOBUFSNão há buffers suficientes disponíveis; muitas conexões.WSAENOTSOCKO descritor não é um soquete.
Comentários
Essa rotina é usada em um datagrama não conectado ou soquete de fluxo, antes de chamadas subsequentes Connect ou Listen. Antes de aceitar solicitações de conexão, um soquete do servidor ouvinte deve selecionar um número de porta e torná-lo conhecido pelo Windows Sockets chamando Bind.
Bind estabelece a associação local (endereço do host/número da porta) do soquete atribuindo um nome local a um soquete sem nome.
CAsyncSocket::CAsyncSocket
Constrói um objeto de soquete em branco.
CAsyncSocket();
Comentários
Depois de construir o objeto, você deve chamar sua função de membro Create para criar a estrutura de dados SOCKET e associar seu endereço. (No lado do servidor de uma comunicação do Windows Sockets, quando o soquete de escuta cria um soquete a ser usado na chamada Accept, você não chama Create para esse soquete.)
CAsyncSocket::Close
Fecha o soquete.
virtual void Close();
Comentários
Essa função libera o descritor de soquete para que outras referências a ele falhem com o erro WSAENOTSOCK. Se essa for a última referência ao soquete subjacente, as informações de nomenclatura associadas e os dados enfileirados serão descartados. O destruidor do objeto de soquete chama Close para você.
Para CAsyncSocket, mas não para CSocket, a semântica de Close é afetada pelas opções de soquete SO_LINGER e SO_DONTLINGER. Para obter mais informações, consulte a função de membro GetSockOpt.
CAsyncSocket::Connect
Chame essa função de membro para estabelecer uma conexão com um fluxo não conectado ou soquete de datagrama.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parâmetros
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de computador como "ftp.microsoft.com" ou um número pontilhado, como "128.56.22.8".
nHostPort
A porta que identifica o aplicativo de soquete.
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que contém o endereço do soquete conectado.
nSockAddrLen
O comprimento do endereço em lpSockAddr, em bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Se isso indicar um código de erro WSAEWOULDBLOCK e seu aplicativo estiver usando os retornos de chamada substituíveis, seu aplicativo receberá uma mensagem OnConnect quando a operação de conexão for concluída. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSEO endereço especificado já está sendo usado.WSAEINPROGRESSUma chamada de Bloqueio do Windows Sockets está em andamento.WSAEADDRNOTAVAILO endereço especificado não está disponível no computador local.WSAEAFNOSUPPORTOs endereços na família especificada não podem ser usados com este soquete.WSAECONNREFUSEDA tentativa de conexão foi rejeitada.WSAEDESTADDRREQEndereço de destino necessário.WSAEFAULTO argumentonSockAddrLenestá incorreto.WSAEINVALEndereço de host inválido.WSAEISCONNO soquete já está conectado.WSAEMFILENenhum outro descritor de arquivo disponível.WSAENETUNREACHA rede não pode ser alcançada através desse host neste momento.WSAENOBUFSNenhum espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTSOCKO descritor não é um soquete.WSAETIMEDOUTTente se conectar com o tempo limite sem estabelecer uma conexão.WSAEWOULDBLOCKO soquete é marcado como de não desbloqueio e a conexão não pode ser concluída imediatamente.
Comentários
Se o soquete estiver desvinculado, os valores exclusivos serão atribuídos à associação local pelo sistema e o soquete será marcado como associado. Observe que, se o campo de endereço da estrutura de nomes for todos zeros, Connect retornará zero. Para obter outras informações sobre o erro, chame a função de membro GetLastError.
Para soquetes de fluxo (tipo SOCK_STREAM), uma conexão ativa é iniciada para o host estrangeiro. Quando a chamada de soquete for concluída com êxito, o soquete estará pronto para enviar/receber dados.
Para um soquete de datagrama (tipo SOCK_DGRAM), um destino padrão é definido, que será usado em chamadas subsequentes Send e Receive.
CAsyncSocket::Create
Chame a função de membro Create depois de construir um objeto de soquete para criar o soquete do Windows e anexá-lo.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
Parâmetros
nSocketPort
Uma porta conhecida a ser usada com o soquete, ou 0 se você quiser que o Windows Socket selecione uma porta.
nSocketType
SOCK_STREAM ou SOCK_DGRAM.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede em que o aplicativo está interessado.
FD_READDeseja receber uma notificação de preparação para leitura.FD_WRITEDeseja receber uma notificação de preparação para escrita.FD_OOBDeseja receber uma notificação da chegada de dados fora da banda.FD_ACCEPTDeseja receber uma notificação de conexões de entrada.FD_CONNECTDeseja receber notificação de conexão concluída.FD_CLOSEDeseja receber uma notificação de fechamento do soquete.
lpszSockAddress
Um ponteiro para uma cadeia de caracteres que contém o endereço de rede do soquete conectado, um número separado por pontos, como "128.56.22.8". Passar a cadeia de caracteres NULL para esse parâmetro indica que a instância CAsyncSocket deve escutar a atividade do cliente em todos os interfaces de rede.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEAFNOSUPPORTA família de endereços especificada não tem suporte.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEMFILENenhum outro descritor de arquivo disponível.WSAENOBUFSNenhum espaço de buffer disponível. O soquete não pode ser criado.WSAEPROTONOSUPPORTA porta especificada não é suportada.WSAEPROTOTYPEA porta especificada é o tipo errado para este soquete.WSAESOCKTNOSUPPORTO suporte para o tipo de soquete especificado não tem suporte nessa família de endereços.
Comentários
Create chama Socket e, se bem-sucedido, chama Bind para associar o soquete ao endereço especificado. Há suporte para os seguintes tipos de soquete:
SOCK_STREAMFornece fluxos de bytes baseados em conexão sequenciados, confiáveis e totalmente duplex. Usa o Protocolo de Controle de Transmissão (TCP) para a família de endereços da Internet.SOCK_DGRAMSuporta datagramas, que são pacotes sem conexão e não confiáveis de um comprimento máximo fixo (normalmente pequeno). Usa o UDP (User Datagram Protocol) para a família de endereços da Internet.Observação
A função membro
Acceptfaz uma referência a um novo objetoCSocketvazio como seu parâmetro. Você deve construir esse objeto antes de chamarAccept. Tenha em mente que, se esse objeto de soquete ficar fora do escopo, a conexão será fechada. Não chameCreatepara esse novo objeto de soquete.
Importante
Create não é seguros para threads. Se você estiver chamando-o em um ambiente com vários threads em que ele pode ser invocado simultaneamente por threads diferentes, certifique-se de proteger cada chamada com um mutex ou outro bloqueio de sincronização.
Para obter mais informações sobre soquetes de fluxo e datagrama, consulte os artigos Windows Sockets: Soquetes em segundo plano, Windows Sockets: Endereços de portas e soquetes e API do Windows Sockets 2.
CAsyncSocket::CreateEx
Chame a função de membro CreateEx depois de construir um objeto de soquete para criar o soquete do Windows e anexá-lo.
Use essa função quando precisar fornecer opções avançadas, como o tipo de soquete.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parâmetros
pAI
Um ponteiro para um ADDRINFOT para conter informações de soquete, como a família e o tipo de soquete.
lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede em que o aplicativo está interessado.
FD_READDeseja receber uma notificação de preparação para leitura.FD_WRITEDeseja receber uma notificação de preparação para escrita.FD_OOBDeseja receber uma notificação da chegada de dados fora da banda.FD_ACCEPTDeseja receber uma notificação de conexões de entrada.FD_CONNECTDeseja receber notificação de conexão concluída.FD_CLOSEDeseja receber uma notificação de fechamento do soquete.
Valor de retorno
Consulte o valor retornado para Create().
Comentários
Consulte os comentário de Create().
CAsyncSocket::Detach
Chame essa função de membro para desanexar o identificador SOCKET no membro de dados m_hSocket do objeto CAsyncSocket e defina m_hSocket como NULL.
SOCKET Detach();
CAsyncSocket::FromHandle
Um ponteiro para um objeto CAsyncSocket.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parâmetros
hSocket
Contém um identificador de um soquete.
Valor de retorno
Um ponteiro para um objeto CAsyncSocket, ou NULL se não houver nenhum objeto CAsyncSocket anexado a hSocket.
Comentários
Quando um identificador SOCKET for fornecido, se um objeto CAsyncSocket não estiver anexado ao identificador, a função de membro retornará NULL.
CAsyncSocket::GetLastError
Chame essa função de membro para obter o status de erro da última operação que falhou.
static int PASCAL GetLastError();
Valor de retorno
O valor retornado indica o código de erro para a última rotina de API de Soquetes do Windows executada por esse thread.
Comentários
Quando uma função membro específica indica que ocorreu um erro, GetLastError deve ser chamado para recuperar o código de erro apropriado. Consulte as descrições de função de membro individual para obter uma lista de códigos de erro aplicáveis.
Para obter mais informações sobre os códigos de erro, consulte a API do Windows Sockets 2.
CAsyncSocket::GetPeerName
Chame essa função de membro para obter o endereço do soquete par ao qual esse soquete está conectado.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parâmetros
rPeerAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rPeerPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para a estrutura SOCKADDR que recebe o nome do soquete par.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr, em bytes. No retorno, o argumento lpSockAddrLen contém o tamanho real de lpSockAddr retornado em bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLennão é grande o suficiente.WSAEINPROGRESSUma chamada de Bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.
Comentários
Para lidar com endereços IPv6, use CAsyncSocket::GetPeerNameEx.
CAsyncSocket::GetPeerNameEx
Chame essa função de membro para obter o endereço do soquete par ao qual esse soquete está conectado (lida com endereços IPv6).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parâmetros
rPeerAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rPeerPort
Referência a um UINT que armazena uma porta.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLennão é grande o suficiente.WSAEINPROGRESSUma chamada de Bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.
Comentários
Essa função é a mesma que CAsyncSocket::GetPeerName, exceto que ela manipula endereços IPv6, bem como protocolos mais antigos.
CAsyncSocket::GetSockName
Chame essa função de membro para obter o nome local de um soquete.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parâmetros
rSocketAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rSocketPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que recebe o endereço do soquete.
lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr, em bytes.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLennão é grande o suficiente.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEINVALO soquete não foi associado a um endereço comBind.
Comentários
Essa chamada é especialmente útil quando uma chamada Connect foi feita sem fazer uma chamada Bind primeiro; essa chamada fornece os únicos meios pelos quais você pode determinar a associação local que foi definida pelo sistema.
Para lidar com endereços IPv6, use CAsyncSocket::GetSockNameEx.
CAsyncSocket::GetSockNameEx
Chame essa função de membro para obter o nome local de um soquete (lida com endereços IPv6).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parâmetros
rSocketAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rSocketPort
Referência a um UINT que armazena uma porta.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLennão é grande o suficiente.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEINVALO soquete não foi associado a um endereço comBind.
Comentários
Essa chamada é a mesma que CAsyncSocket::GetSockName, exceto que ela manipula endereços IPv6, bem como protocolos mais antigos.
Essa chamada é especialmente útil quando uma chamada Connect foi feita sem fazer uma chamada Bind primeiro; essa chamada fornece os únicos meios pelos quais você pode determinar a associação local que foi definida pelo sistema.
CAsyncSocket::GetSockOpt
Chame essa função de membro para recuperar uma opção de soquete.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parâmetros
nOptionName
A opção de soquete para a qual o valor deve ser recuperado.
lpOptionValue
Um ponteiro para o buffer no qual o valor da opção solicitada deve ser retornado. O valor associado à opção selecionada é retornado no buffer lpOptionValue. O inteiro apontado por lpOptionLen deve conter originalmente o tamanho desse buffer em bytes; e, no retorno, ele será definido como o tamanho do valor retornado. Para SO_LINGER, esse será o tamanho de uma estrutura LINGER; para todas as outras opções, ele será do tamanho de um BOOL ou um int, dependendo da opção. Consulte a lista de opções e seus tamanhos na seção Comentários.
lpOptionLen
Um ponteiro para o tamanho do buffer lpOptionValue em bytes.
nLevel
O nível no qual a opção é definida; os únicos níveis com suporte são SOL_SOCKET e IPPROTO_TCP.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Se uma opção nunca tiver sido definida com SetSockOpt, GetSockOpt retorna o valor padrão para a opção. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpOptionLenera inválido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOPROTOOPTA opção é desconhecida ou sem suporte. Em particular, não há suporte aSO_BROADCASTem soquetes do tipoSOCK_STREAM, enquantoSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE,SO_LINGEReSO_OOBINLINEnão têm suporte em soquetes do tipoSOCK_DGRAM.WSAENOTSOCKO descritor não é um soquete.
Comentários
GetSockOpt recupera o valor atual para uma opção de soquete associada a um soquete de qualquer tipo, em qualquer estado, e armazena o resultado em lpOptionValue. As opções afetam as operações de soquete, como o roteamento de pacotes, a transferência de dados fora da banda e assim por diante.
As seguintes opções são suportadas para GetSockOpt. O Type identifica o tipo de dados endereçados por lpOptionValue. A opção TCP_NODELAY usa nível IPPROTO_TCP; todas as outras opções usam o nível SOL_SOCKET.
| Valor | Tipo | Significado |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
O soquete está escutando. |
SO_BROADCAST |
BOOL |
O soquete está configurado para a transmissão de mensagens de transmissão. |
SO_DEBUG |
BOOL |
A depuração está habilitada |
SO_DONTLINGER |
BOOL |
Se for true, a opção SO_LINGER será desabilitada. |
SO_DONTROUTE |
BOOL |
O roteamento está desabilitado. |
SO_ERROR |
int |
Recuperar o status de erro e limpar. |
SO_KEEPALIVE |
BOOL |
Os keep-alives estão sendo enviados. |
SO_LINGER |
struct LINGER |
Retorna as opções persistentes atuais. |
SO_OOBINLINE |
BOOL |
Os dados fora de banda estão sendo recebidos no fluxo de dados normal. |
SO_RCVBUF |
int |
Tamanho do buffer para recebimentos. |
SO_REUSEADDR |
BOOL |
O soquete pode ser associado a um endereço que já está em uso. |
SO_SNDBUF |
int |
Tamanho do buffer para envios. |
SO_TYPE |
int |
O tipo do soquete (por exemplo, SOCK_STREAM). |
TCP_NODELAY |
BOOL |
Desabilita o algoritmo Nagle para união de envio. |
As opções do Berkeley Software Distribution (BSD) para as quais não há suporte para GetSockOpt são:
| Valor | Tipo | Significado |
|---|---|---|
SO_RCVLOWAT |
int |
A marca d'água baixa de recebimento. |
SO_RCVTIMEO |
int |
Tempo limite de recebimento. |
SO_SNDLOWAT |
int |
Marca d'água baixa de envio. |
SO_SNDTIMEO |
int |
O tempo limite de envio. |
IP_OPTIONS |
Obter opções no cabeçalho IP. | |
TCP_MAXSEG |
int |
Obter o tamanho máximo de segmento do TCP. |
Chamar GetSockOpt com uma opção sem suporte resultará em um código de erro de WSAENOPROTOOPT sendo retornado de GetLastError.
CAsyncSocket::IOCtl
Chame essa função de membro para controlar o modo de um soquete.
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
Parâmetros
lCommand
O comando a ser executado no soquete.
lpArgument
Um ponteiro para um parâmetro de lCommand.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVALlCommandnão é um comando válido oulpArgumentnão é um parâmetro aceitável paralCommand, ou o comando não é aplicável ao tipo de soquete fornecido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.
Comentários
Essa rotina pode ser usada em qualquer soquete em qualquer estado. Ele é usado para obter ou recuperar parâmetros operacionais associados ao soquete, independentemente do subsistema de protocolo e comunicações. Há suporte para os seguintes comandos:
FIONBIOHabilitar ou desabilitar o modo de desbloqueio no soquete. O parâmetrolpArgumentaponta para umDWORD, que não é zero se o modo de desbloqueio deve ser habilitado e zero se for para ser desabilitado. SeAsyncSelecttiver sido emitido em um soquete, qualquer tentativa de usarIOCtlpara definir o soquete de volta ao modo de bloqueio falhará comWSAEINVAL. Para definir o soquete de volta para o modo de bloqueio e evitar o erroWSAEINVAL, um aplicativo deve primeiro desabilitarAsyncSelectchamandoAsyncSelectcom o parâmetrolEventigual a 0 e, em seguida, chamarIOCtl.FIONREADDetermine o número máximo de bytes que podem ser lidos com uma chamadaReceivedesse soquete. O parâmetrolpArgumentaponta para umDWORDem queIOCtlarmazena o resultado. Se esse soquete for do tipoSOCK_STREAM,FIONREADretornará a quantidade total de dados que podem ser lidos em um únicoReceive; normalmente é o mesmo que a quantidade total de dados enfileirados no soquete. Se esse soquete for do tipoSOCK_DGRAM,FIONREADretornará o tamanho do primeiro datagrama enfileirado no soquete.SIOCATMARKDetermine se todos os dados fora de banda foram lidos. Isso se aplica apenas a um soquete do tipoSOCK_STREAMque foi configurado para a recepção em linha de qualquer dado fora de banda (SO_OOBINLINE). Se nenhum dado fora de banda estiver esperando para ser lido, a operação retornará diferente de zero. Caso contrário, ele retorna 0 e o próximoReceiveouReceiveFromexecutado no soquete recuperará alguns ou todos os dados anteriores à "marca"; o aplicativo deve usar a operaçãoSIOCATMARKpara determinar se os dados permanecem. Se houver dados normais que precedem os dados "urgentes" (fora de banda), eles serão recebidos em ordem. (Observe que umReceiveouReceiveFromnunca misturará dados fora de banda e normais na mesma chamada.) O parâmetrolpArgumentaponta para umDWORDem queIOCtlarmazena o resultado.
Essa função é um subconjunto de ioctl() como usado em soquetes Berkeley. Em particular, não há nenhum comando que seja equivalente a FIOASYNC, embora SIOCATMARK seja o único comando no nível de soquete com suporte.
CAsyncSocket::Listen
Chame essa função de membro para escutar solicitações de conexão de entrada.
BOOL Listen(int nConnectionBacklog = 5);
Parâmetros
nConnectionBacklog
O comprimento máximo para o qual a fila de conexões pendentes pode aumentar. O intervalo válido é de 1 a 5.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSEFoi feita uma tentativa de escutar um endereço em uso.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi associado aBindou já está conectado.WSAEISCONNO soquete já está conectado.WSAEMFILENenhum outro descritor de arquivo disponível.WSAENOBUFSNenhum espaço de buffer disponível.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPO soquete referenciado não é de um tipo que dá suporte à operaçãoListen.
Comentários
Para aceitar conexões, o soquete é criado primeiro com Create, um backlog para conexões de entrada é especificado com Listen e, em seguida, as conexões são aceitas com Accept.
Listen aplica-se somente a soquetes que dão suporte a conexões, ou seja, aquelas do tipo SOCK_STREAM. Esse soquete é colocado no modo "passivo", em que as conexões de entrada são reconhecidas e enfileiradas até a aceitação pelo processo.
Essa função normalmente é usada por servidores (ou qualquer aplicativo que queira aceitar conexões) que possa ter mais de uma solicitação de conexão por vez: se uma solicitação de conexão chegar com a fila cheia, o cliente receberá um erro com uma indicação de WSAECONNREFUSED.
Listen tenta continuar a funcionar racionalmente quando não há portas disponíveis (descritores). Ele aceitará conexões até que a fila seja esvaziada. Se as portas ficarem disponíveis, uma chamada posterior para Listen ou Accept recarregará a fila para o "backlog" atual ou mais recente, se possível, e retomará a escuta de conexões de entrada.
CAsyncSocket::m_hSocket
Contém o identificador SOCKET do soquete encapsulado por esse objeto CAsyncSocket.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Chamado pela estrutura para notificar um soquete de escuta de que ele pode aceitar solicitações de conexão pendentes chamando a Accept função de membro.
virtual void OnAccept(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnAccept:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.
Comentários
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnClose
Chamado pela estrutura para notificar esse soquete de que o soquete conectado está fechado por seu processo.
virtual void OnClose(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnClose:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAECONNRESETA conexão foi redefinida pelo lado remoto.WSAECONNABORTEDA conexão foi anulada devido ao tempo limite ou outra falha.
Comentários
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnConnect
Chamado pela estrutura para notificar esse soquete de conexão de que sua tentativa de conexão foi concluída, seja com êxito ou em erro.
virtual void OnConnect(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnConnect:
0 A função executada com êxito.
WSAEADDRINUSEO endereço especificado já está sendo usado.WSAEADDRNOTAVAILO endereço especificado não está disponível no computador local.WSAEAFNOSUPPORTOs endereços na família especificada não podem ser usados com este soquete.WSAECONNREFUSEDA tentativa de conexão foi rejeitada de modo forçado.WSAEDESTADDRREQEndereço de destino necessário.WSAEFAULTO argumentolpSockAddrLenestá incorreto.WSAEINVALO soquete já está associado a um endereço.WSAEISCONNO soquete já está conectado.WSAEMFILENenhum outro descritor de arquivo disponível.WSAENETUNREACHA rede não pode ser alcançada através desse host neste momento.WSAENOBUFSNenhum espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor é um arquivo, não um soquete.WSAETIMEDOUTA tentativa de se conectar com o tempo limite sem estabelecer uma conexão.
Comentários
Observação
Em CSocket, a função de notificação OnConnect nunca é chamada. Para conexões, basta chamar Connect, que retornará quando a conexão for concluída (com êxito ou erro). A forma como as notificações de conexão são tratadas é um detalhe de implementação do MFC.
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
if (0 != nErrorCode)
{
switch (nErrorCode)
{
case WSAEADDRINUSE:
AfxMessageBox(_T("The specified address is already in use.\n"));
break;
case WSAEADDRNOTAVAIL:
AfxMessageBox(_T("The specified address is not available from ")
_T("the local machine.\n"));
break;
case WSAEAFNOSUPPORT:
AfxMessageBox(_T("Addresses in the specified family cannot be ")
_T("used with this socket.\n"));
break;
case WSAECONNREFUSED:
AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
break;
case WSAEDESTADDRREQ:
AfxMessageBox(_T("A destination address is required.\n"));
break;
case WSAEFAULT:
AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
break;
case WSAEINVAL:
AfxMessageBox(_T("The socket is already bound to an address.\n"));
break;
case WSAEISCONN:
AfxMessageBox(_T("The socket is already connected.\n"));
break;
case WSAEMFILE:
AfxMessageBox(_T("No more file descriptors are available.\n"));
break;
case WSAENETUNREACH:
AfxMessageBox(_T("The network cannot be reached from this host ")
_T("at this time.\n"));
break;
case WSAENOBUFS:
AfxMessageBox(_T("No buffer space is available. The socket ")
_T("cannot be connected.\n"));
break;
case WSAENOTCONN:
AfxMessageBox(_T("The socket is not connected.\n"));
break;
case WSAENOTSOCK:
AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
break;
case WSAETIMEDOUT:
AfxMessageBox(_T("The attempt to connect timed out without ")
_T("establishing a connection. \n"));
break;
default:
TCHAR szError[256];
_stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
AfxMessageBox(szError);
break;
}
AfxMessageBox(_T("Please close the application"));
}
CAsyncSocket::OnConnect(nErrorCode);
}
CAsyncSocket::OnOutOfBandData
Chamado pela estrutura para notificar o soquete de recebimento que o soquete de envio tem dados fora de banda a serem enviados.
virtual void OnOutOfBandData(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnOutOfBandData:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.
Comentários
Os dados fora de banda são um canal logicamente independente associado a cada par de soquetes conectados do tipo SOCK_STREAM. O canal geralmente é usado para enviar dados urgentes.
O MFC dá suporte a dados fora de banda, mas os usuários de classe CAsyncSocket são desencorajados a usá-los. A maneira mais fácil é criar um segundo soquete para passar esses dados. Para obter mais informações sobre dados fora de banda, consulte Windows Sockets: notificações de soquete.
CAsyncSocket::OnReceive
Chamado pela estrutura para notificar esse soquete de que há dados no buffer que podem ser recuperados chamando a função de membro Receive.
virtual void OnReceive(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnReceive:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.
Comentários
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
static int i = 0;
i++;
TCHAR buff[4096];
int nRead;
nRead = Receive(buff, 4096);
switch (nRead)
{
case 0:
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
AfxMessageBox(_T("Error occurred"));
Close();
}
break;
default:
buff[nRead] = _T('\0'); //terminate the string
CString szTemp(buff);
m_strRecv += szTemp; // m_strRecv is a CString declared
// in CMyAsyncSocket
if (szTemp.CompareNoCase(_T("bye")) == 0)
{
ShutDown();
s_eventDone.SetEvent();
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
CAsyncSocket::OnSend
Chamado pela estrutura para notificar o soquete de que agora ele pode enviar dados chamando a função de membro Send.
virtual void OnSend(int nErrorCode);
Parâmetros
nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à função de membro OnSend:
0 A função executada com êxito.
WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.
Comentários
Para obter mais informações, consulte Windows Sockets: notificações de soquete.
Exemplo
// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
// CString m_sendBuffer; //for async send
// int m_nBytesSent;
// int m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
while (m_nBytesSent < m_nBytesBufferSize)
{
int dwBytes;
if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
break;
}
else
{
TCHAR szError[256];
_stprintf_s(szError, _T("Server Socket failed to send: %d"),
GetLastError());
Close();
AfxMessageBox(szError);
}
}
else
{
m_nBytesSent += dwBytes;
}
}
if (m_nBytesSent == m_nBytesBufferSize)
{
m_nBytesSent = m_nBytesBufferSize = 0;
m_sendBuffer = _T("");
}
CAsyncSocket::OnSend(nErrorCode);
}
CAsyncSocket::operator =
Atribui um novo valor a um objeto CAsyncSocket.
void operator=(const CAsyncSocket& rSrc);
Parâmetros
rSrc
Uma referência a um objeto CAsyncSocket existente.
Comentários
Chame essa função para copiar um objeto existente CAsyncSocket para outro objeto CAsyncSocket.
CAsyncSocket::operator SOCKET
Use esse operador para recuperar o identificador SOCKET do objeto CAsyncSocket.
operator SOCKET() const;
Valor de retorno
Se tiver êxito, o identificador do objeto SOCKET; caso contrário, NULL.
Comentários
Você pode usar o identificador para chamar as APIs do Windows diretamente.
CAsyncSocket::Receive
Chame essa função de membro para receber dados de um soquete.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados de entrada.
nBufLen
O tamanho de lpBuf em bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_PEEKInspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se nenhum erro ocorrer, Receive retornará o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor SOCKET_ERROR é retornado e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAENOTCONNO soquete não está conectado.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarReceiveem um soquete depois deShutDownter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operaçãoReceiveseria bloqueada.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAEINVALO soquete não foi associado aBind.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.
Comentários
Essa função é usada para soquetes de fluxo ou datagrama conectados e é usada para ler dados de entrada.
Para soquetes do tipo SOCK_STREAM, a quantidade de informações que está disponível atualmente até o tamanho do buffer fornecido é retornada. Se o soquete tiver sido configurado para recepção em linha de dados fora de banda (opção de soquete SO_OOBINLINE) e os dados fora de banda não forem lidos, somente dados fora de banda serão retornados. O aplicativo pode usar a opção IOCtlSIOCATMARK ou OnOutOfBandData para determinar se ainda há mais dados fora de banda a serem lidos.
Para soquetes de datagram, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagram for maior que o buffer fornecido, o buffer será preenchido com a primeira parte do datagrama, o excesso de dados será perdido e Receive retornará um valor de SOCKET_ERROR com código de erro definido como WSAEMSGSIZE. Se nenhum dado de entrada estiver disponível no soquete, um valor será retornado com o código de erro SOCKET_ERROR definido como WSAEWOULDBLOCK. A função de retorno de chamada OnReceive pode ser usada para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um Receive concluirá imediatamente com 0 bytes recebidos. Se a conexão tiver sido redefinida, um Receive com o erro WSAECONNRESET.
Receive deve ser chamado apenas uma vez para cada vez que CAsyncSocket::OnReceive for chamado.
Exemplo
Confira o exemplo de CAsyncSocket::OnReceive.
CAsyncSocket::ReceiveFrom
Chame essa função de membro para receber um datagrama e armazenar o endereço de origem na estrutura SOCKADDR ou em rSocketAddress.
int ReceiveFrom(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
int ReceiveFrom(
void* lpBuf,
int nBufLen,
SOCKADDR* lpSockAddr,
int* lpSockAddrLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados de entrada.
nBufLen
O tamanho de lpBuf em bytes.
rSocketAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rSocketPort
Referência a um UINT que armazena uma porta.
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que contém o endereço de origem no retorno.
lpSockAddrLen
Um ponteiro para o comprimento do endereço de origem em lpSockAddr, em bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_PEEKInspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se nenhum erro ocorrer, ReceiveFrom retornará o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor SOCKET_ERROR é retornado e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLenera inválido: o bufferlpSockAddrera muito pequeno para acomodar o endereço par.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi associado aBind.WSAENOTCONNO soquete não está conectado (somenteSOCK_STREAM).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarReceiveFromem um soquete depois deShutDownter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operaçãoReceiveFromseria bloqueada.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.
Comentários
Essa função é usada para ler dados de entrada em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.
Para lidar com endereços IPv6, use CAsyncSocket::ReceiveFromEx.
Para soquetes do tipo SOCK_STREAM, a quantidade de informações que está disponível atualmente até o tamanho do buffer fornecido é retornada. Se o soquete tiver sido configurado para recepção em linha de dados fora de banda (opção de soquete SO_OOBINLINE) e os dados fora de banda não forem lidos, somente dados fora de banda serão retornados. O aplicativo pode usar a opção IOCtlSIOCATMARK ou OnOutOfBandData para determinar se ainda há mais dados fora de banda a serem lidos. Os parâmetros lpSockAddr e lpSockAddrLen são ignorados para soquetes SOCK_STREAM.
Para soquetes de datagram, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagram for maior que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, o excesso de dados será perdido e ReceiveFrom retornará um valor de SOCKET_ERROR com código de erro definido como WSAEMSGSIZE.
Se lpSockAddr for diferente de zero e o soquete for do tipo SOCK_DGRAM, o endereço de rede do soquete que enviou os dados será copiado para a estrutura SOCKADDR correspondente. O valor apontado por lpSockAddrLen é inicializado para o tamanho dessa estrutura e é modificado no retorno para indicar o tamanho real do endereço armazenado lá. Se nenhum dado de entrada estiver disponível no soquete, a chamada ReceiveFrom aguardará a chegada dos dados, a menos que o soquete não esteja desbloqueado. Nesse caso, um valor é retornado com o código de erro SOCKET_ERROR definido como WSAEWOULDBLOCK. A chamada de retorno OnReceive pode ser usada para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um ReceiveFrom concluirá imediatamente com 0 bytes recebidos.
CAsyncSocket::ReceiveFromEx
Chame essa função de membro para receber um datagrama e armazenar o endereço de origem na estrutura SOCKADDR ou em rSocketAddress (lida com endereços IPv6).
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer para os dados de entrada.
nBufLen
O tamanho de lpBuf em bytes.
rSocketAddress
Referência a um objeto CString que recebe um endereço IP separado por pontos.
rSocketPort
Referência a um UINT que armazena uma porta.
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_PEEKInspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOBProcessar dados fora de banda.
Valor de retorno
Se nenhum erro ocorrer, ReceiveFromEx retornará o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor SOCKET_ERROR é retornado e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTO argumentolpSockAddrLenera inválido: o bufferlpSockAddrera muito pequeno para acomodar o endereço par.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALO soquete não foi associado aBind.WSAENOTCONNO soquete não está conectado (somenteSOCK_STREAM).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarReceiveFromExem um soquete depois deShutDownter sido invocado comnHowdefinido como 0 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operaçãoReceiveFromExseria bloqueada.WSAEMSGSIZEO datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.
Comentários
Essa função é usada para ler dados de entrada em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.
Essa função é a mesma que CAsyncSocket::ReceiveFrom, exceto que ela manipula endereços IPv6, bem como protocolos mais antigos.
Para soquetes do tipo SOCK_STREAM, a quantidade de informações que está disponível atualmente até o tamanho do buffer fornecido é retornada. Se o soquete tiver sido configurado para recepção em linha de dados fora de banda (opção de soquete SO_OOBINLINE) e os dados fora de banda não forem lidos, somente dados fora de banda serão retornados. O aplicativo pode usar a opção IOCtlSIOCATMARK ou OnOutOfBandData para determinar se ainda há mais dados fora de banda a serem lidos. Os parâmetros lpSockAddr e lpSockAddrLen são ignorados para soquetes SOCK_STREAM.
Para soquetes de datagram, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagram for maior que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, o excesso de dados será perdido e ReceiveFromEx retornará um valor de SOCKET_ERROR com código de erro definido como WSAEMSGSIZE.
Se lpSockAddr for diferente de zero e o soquete for do tipo SOCK_DGRAM, o endereço de rede do soquete que enviou os dados será copiado para a estrutura SOCKADDR correspondente. O valor apontado por lpSockAddrLen é inicializado para o tamanho dessa estrutura e é modificado no retorno para indicar o tamanho real do endereço armazenado lá. Se nenhum dado de entrada estiver disponível no soquete, a chamada ReceiveFromEx aguardará a chegada dos dados, a menos que o soquete não esteja desbloqueado. Nesse caso, um valor é retornado com o código de erro SOCKET_ERROR definido como WSAEWOULDBLOCK. A chamada de retorno OnReceive pode ser usada para determinar quando mais dados chegam.
Se o soquete for do tipo SOCK_STREAM e o lado remoto tiver desligado a conexão normalmente, um ReceiveFromEx concluirá imediatamente com 0 bytes recebidos.
CAsyncSocket::Send
Chame essa função de membro para enviar dados em um soquete conectado.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer que contém os dados a serem transmitidos.
nBufLen
O tamanho dos dados lpBuf, em bytes.
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnviar dados fora da banda (somenteSOCK_STREAM).
Valor de retorno
Se nenhum erro ocorrer, Send retornará o número total de caracteres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor é retornado e um código de erro SOCKET_ERROR específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTO argumentolpBufnão está em uma parte válida do espaço de endereço do usuário.WSAENETRESETA conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado.WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarSendem um soquete depois deShutDownter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAEINVALO soquete não foi associado aBind.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.
Comentários
Send é usado para gravar dados de saída em soquetes de fluxo ou datagrama conectados. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é fornecido pelo elemento iMaxUdpDg na estrutura WSADATA retornada por AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado por meio GetLastError e nenhum dado será transmitido.
Observe que, para um soquete de datagrama, a conclusão bem-sucedida de um Send não indica que os dados foram entregues com êxito.
Em objetos CAsyncSocket de tipo SOCK_STREAM, o número de bytes gravados pode ser entre 1 e o comprimento solicitado, dependendo da disponibilidade do buffer nos hosts locais e estrangeiros.
Exemplo
Confira o exemplo de CAsyncSocket::OnSend.
CAsyncSocket::SendTo
Chame essa função de membro para enviar dados para um destino específico.
int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer que contém os dados a serem transmitidos.
nBufLen
O tamanho dos dados lpBuf, em bytes.
nHostPort
A porta que identifica o aplicativo de soquete.
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de computador como "ftp.microsoft.com" ou um número separado por pontos, como "128.56.22.8".
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnviar dados fora da banda (somenteSOCK_STREAM).
lpSockAddr
Um ponteiro para uma estrutura SOCKADDR que contém o endereço do soquete de destino.
nSockAddrLen
O comprimento do endereço em lpSockAddr, em bytes.
Valor de retorno
Se nenhum erro ocorrer, SendTo retornará o número total de caracteres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor é retornado e um código de erro SOCKET_ERROR específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTOs parâmetroslpBufoulpSockAddrnão fazem parte do espaço de endereço do usuário ou o argumentolpSockAddré muito pequeno (menor que o tamanho de uma estruturaSOCKADDR).WSAEINVALO nome de host é inválido.WSAENETRESETA conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado (somenteSOCK_STREAM).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarSendToem um soquete depois deShutDownter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.WSAEADDRNOTAVAILO endereço especificado não está disponível no computador local.WSAEAFNOSUPPORTOs endereços na família especificada não podem ser usados com este soquete.WSAEDESTADDRREQEndereço de destino necessário.WSAENETUNREACHA rede não pode ser alcançada através desse host neste momento.
Comentários
SendTo é usado em soquetes de fluxo ou datagrama e é usado para gravar dados de saída em um soquete. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é fornecido pelo elemento iMaxUdpDg na estrutura WSADATA preenchida por AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado, e nenhum dado será transmitido.
Observe que a conclusão bem-sucedida de um SendTo não indica que os dados foram entregues com êxito.
SendTo é usado apenas em um soquete SOCK_DGRAM para enviar um datagrama para um soquete específico identificado pelo parâmetro lpSockAddr.
Para enviar uma transmissão (somente em um SOCK_DGRAM), o endereço no parâmetro lpSockAddr deve ser construído usando o endereço IP especial INADDR_BROADCAST (definido no arquivo de cabeçalho WINSOCK.H do Windows Socket) junto com o número de porta pretendido. Ou, se o parâmetro lpszHostAddress for NULL, o soquete será configurado para transmissão. Geralmente, não é recomendável que um datagrama de difusão exceda o tamanho em que a fragmentação pode ocorrer, o que implica que a parte de dados do datagram (excluindo cabeçalhos) não deve exceder 512 bytes.
Para lidar com endereços IPv6, use CAsyncSocket::SendToEx.
CAsyncSocket::SendToEx
Chame essa função de membro para enviar dados para um destino específico (lida com endereços IPv6).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parâmetros
lpBuf
Um buffer que contém os dados a serem transmitidos.
nBufLen
O tamanho dos dados lpBuf, em bytes.
nHostPort
A porta que identifica o aplicativo de soquete.
lpszHostAddress
O endereço de rede do soquete ao qual esse objeto está conectado: um nome de computador como "ftp.microsoft.com" ou um número separado por pontos, como "128.56.22.8".
nFlags
Especifica a maneira como a chamada é feita. A semântica dessa função é determinada pelas opções de soquete e pelo parâmetro nFlags. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C++ (|):
MSG_DONTROUTEEspecifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOBEnviar dados fora da banda (somenteSOCK_STREAM).
Valor de retorno
Se nenhum erro ocorrer, SendToEx retornará o número total de caracteres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor é retornado e um código de erro SOCKET_ERROR específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCESO endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULTOs parâmetroslpBufoulpSockAddrnão fazem parte do espaço de endereço do usuário ou o argumentolpSockAddré muito pequeno (menor que o tamanho de uma estruturaSOCKADDR).WSAEINVALO nome de host é inválido.WSAENETRESETA conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFSA implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONNO soquete não está conectado (somenteSOCK_STREAM).WSAENOTSOCKO descritor não é um soquete.WSAEOPNOTSUPPMSG_OOBfoi especificado, mas o soquete não é do tipoSOCK_STREAM.WSAESHUTDOWNO soquete foi desligado; não é possível chamarSendToExem um soquete depois deShutDownter sido invocado comnHowdefinido como 1 ou 2.WSAEWOULDBLOCKO soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZEO soquete é do tipoSOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTEDO circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESETO circuito virtual foi redefinido pelo lado remoto.WSAEADDRNOTAVAILO endereço especificado não está disponível no computador local.WSAEAFNOSUPPORTOs endereços na família especificada não podem ser usados com este soquete.WSAEDESTADDRREQEndereço de destino necessário.WSAENETUNREACHA rede não pode ser alcançada através desse host neste momento.
Comentários
Esse método é o mesma que CAsyncSocket::SendTo, exceto que ele manipula endereços IPv6, bem como protocolos mais antigos.
SendToEx é usado em soquetes de fluxo ou datagrama e é usado para gravar dados de saída em um soquete. Para soquetes de datagrama, deve-se tomar cuidado para não exceder o tamanho máximo do pacote IP das sub-redes subjacentes, que é fornecido pelo elemento iMaxUdpDg na estrutura WSADATA preenchida por AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado, e nenhum dado será transmitido.
Observe que a conclusão bem-sucedida de um SendToEx não indica que os dados foram entregues com êxito.
SendToEx é usado apenas em um soquete SOCK_DGRAM para enviar um datagrama para um soquete específico identificado pelo parâmetro lpSockAddr.
Para enviar uma transmissão (somente em um SOCK_DGRAM), o endereço no parâmetro lpSockAddr deve ser construído usando o endereço IP especial INADDR_BROADCAST (definido no arquivo de cabeçalho WINSOCK.H do Windows Socket) junto com o número de porta pretendido. Ou, se o parâmetro lpszHostAddress for NULL, o soquete será configurado para transmissão. Geralmente, não é recomendável que um datagrama de difusão exceda o tamanho em que a fragmentação pode ocorrer, o que implica que a parte de dados do datagram (excluindo cabeçalhos) não deve exceder 512 bytes.
CAsyncSocket::SetSockOpt
Chame essa função de membro para definir uma opção de soquete.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parâmetros
nOptionName
A opção de soquete para a qual o valor deve ser definido.
lpOptionValue
Um ponteiro para o buffer no qual o valor da opção solicitada é fornecido.
nOptionLen
O tamanho do buffer lpOptionValue em bytes.
nLevel
O nível no qual a opção é definida; os únicos níveis com suporte são SOL_SOCKET e IPPROTO_TCP.
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULTlpOptionValuenão está em uma parte válida do espaço de endereço do processo.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAEINVALnLevelnão é válida ou as informações contidas nãolpOptionValuesão válidas.WSAENETRESETA conexão atingiu o tempo limite quandoSO_KEEPALIVEé definido.WSAENOPROTOOPTA opção é desconhecida ou sem suporte. Em particular,SO_BROADCASTnão é suportado em soquetes de tipoSOCK_STREAM, enquantoSO_DONTLINGER,SO_KEEPALIVE,SO_LINGEReSO_OOBINLINEnão são suportados em soquetes de tipoSOCK_DGRAM.WSAENOTCONNA conexão foi redefinida quandoSO_KEEPALIVEé definido.WSAENOTSOCKO descritor não é um soquete.
Comentários
SetSockOpt define o valor atual para uma opção de soquete associada a um soquete de qualquer tipo, em qualquer estado. Embora as opções possam existir em vários níveis de protocolo, essa especificação define apenas as opções que existem no nível superior de "soquete". As opções afetam as operações de soquete, como se os dados acelerados são recebidos no fluxo de dados normal, se as mensagens de transmissão podem ser enviadas no soquete e assim por diante.
Há dois tipos de opções de soquete: opções boolianas que habilitam ou desabilitam um recurso ou comportamento e opções que exigem um valor inteiro ou uma estrutura. Para habilitar uma opção booliana, lpOptionValue aponta para um inteiro diferente de zero. Para desabilitar a opção, lpOptionValue aponta para um inteiro igual a zero.
nOptionLen deve ser igual a sizeof(BOOL) para opções boolianas. Para outras opções, lpOptionValue aponta para o inteiro ou estrutura que contém o valor desejado para a opção e nOptionLen é o tamanho do inteiro ou da estrutura.
SO_LINGER controla a ação executada quando dados não solicitados são enfileirados em um soquete e a função Close é chamada para fechar o soquete.
Por padrão, um soquete não pode ser associado (veja Bind) a um endereço local que já esteja em uso. Na ocasião, no entanto, pode ser desejável "reutilizar" um endereço dessa forma. Como cada conexão é identificada exclusivamente pela combinação de endereços locais e remotos, não há problema em ter dois soquetes associados ao mesmo endereço local, desde que os endereços remotos sejam diferentes.
Para informar a implementação do Windows Sockets de que uma chamada Bind em um soquete não deve ser permitida porque o endereço desejado já está em uso por outro soquete, o aplicativo deve definir a opção de soquete SO_REUSEADDR para o soquete antes de emitir a chamada Bind. Observe que a opção é interpretada somente no momento da chamada Bind: portanto, é desnecessário (mas inofensivo) definir a opção em um soquete que não deve ser associado a um endereço existente e definir ou redefinir a opção após a chamada Bind não ter efeito sobre esse ou qualquer outro soquete.
Um aplicativo pode solicitar que a implementação de Soquetes do Windows habilite o uso de pacotes "keep-alive" em conexões TCP (Protocolo de Controle de Transmissão) ativando a opção de soquete SO_KEEPALIVE. Uma implementação do Windows Sockets não precisa dar suporte ao uso de keep-alives: se isso acontecer, a semântica precisa é específica da implementação, mas deve estar em conformidade com a seção 4.2.3.6 do RFC 1122: "Requisitos para hosts da Internet – Camadas de comunicação". Se uma conexão for descartada como resultado de "keep-alives", o código de erro WSAENETRESET será retornado a todas as chamadas em andamento no soquete e as chamadas subsequentes falharão com WSAENOTCONN.
A opção TCP_NODELAY desabilita o algoritmo Nagle. O algoritmo Nagle é usado para reduzir o número de pacotes pequenos enviados por um host armazenando em buffer dados de envio não reconhecidos até que um pacote de tamanho completo possa ser enviado. No entanto, para alguns aplicativos, esse algoritmo pode impedir o desempenho e TCP_NODELAY pode ser usado para desativá-lo. Os gravadores de aplicativos não devem definir TCP_NODELAY, a menos que o impacto de fazer isso seja bem compreendido e desejado, pois a configuração TCP_NODELAY pode ter um impacto negativo significativo no desempenho da rede.
TCP_NODELAY é a única opção de soquete com suporte que usa o nível IPPROTO_TCP; todas as outras opções usam o nível SOL_SOCKET.
Algumas implementações de Windows Sockets fornecem informações de depuração de saída se a opção SO_DEBUG for definida por um aplicativo.
As seguintes opções são suportadas para SetSockOpt. O Type identifica o tipo de dados endereçados por lpOptionValue.
| Valor | Tipo | Significado |
|---|---|---|
SO_BROADCAST |
BOOL |
Permitir a transmissão de mensagens de transmissão no soquete. |
SO_DEBUG |
BOOL |
Registre informações de depuração. |
SO_DONTLINGER |
BOOL |
Não bloqueie Close esperando que dados não enviados sejam enviados. Definir essa opção é equivalente à configuração SO_LINGER com l_onoff definido como zero. |
SO_DONTROUTE |
BOOL |
Não rotear: envie diretamente para a interface. |
SO_KEEPALIVE |
BOOL |
Keep alives de envio. |
SO_LINGER |
struct LINGER |
Demora Close se dados não enviados estiverem presentes. |
SO_OOBINLINE |
BOOL |
Receba dados fora de banda no fluxo de dados normal. |
SO_RCVBUF |
int |
Especifique o tamanho do buffer para recebimentos. |
SO_REUSEADDR |
BOOL |
Permita que o soquete pode ser associado a um endereço que já está em uso. (Consulte Bind.) |
SO_SNDBUF |
int |
Especifique o tamanho do buffer para envios. |
TCP_NODELAY |
BOOL |
Desabilita o algoritmo Nagle para união de envio. |
As opções do Berkeley Software Distribution (BSD) para as quais não há suporte para SetSockOpt são:
| Valor | Tipo | Significado |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
O soquete está escutando |
SO_ERROR |
int |
Obtém o status de erro e limpe. |
SO_RCVLOWAT |
int |
A marca d'água baixa de recebimento. |
SO_RCVTIMEO |
int |
Tempo limite de recebimento |
SO_SNDLOWAT |
int |
Marca d'água baixa de envio. |
SO_SNDTIMEO |
int |
O tempo limite de envio. |
SO_TYPE |
int |
Tipo do soquete. |
IP_OPTIONS |
Defina o campo opções no cabeçalho IP. |
CAsyncSocket::ShutDown
Chame essa função de membro para desabilitar envios, recebimentos ou ambos no soquete.
BOOL ShutDown(int nHow = sends);
Parâmetros
nHow
Um sinalizador que descreve quais tipos de operação não serão mais permitidos, usando os seguintes valores enumerados:
receives = 0
envios = 1
both = 2
Valor de retorno
Diferente de zero se a função for bem-sucedida; caso contrário, 0 e um código de erro específico pode ser recuperado chamando GetLastError. Os seguintes erros se aplicam a essa função de membro:
WSANOTINITIALISEDUmAfxSocketInitbem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWNA implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVALnHownão é válido.WSAEINPROGRESSUma operação de bloqueio do Windows Sockets está em andamento.WSAENOTCONNO soquete não está conectado (somenteSOCK_STREAM).WSAENOTSOCKO descritor não é um soquete.
Comentários
ShutDown é usado em todos os tipos de soquetes para desabilitar a recepção, a transmissão ou ambos. Se nHow for 0, os recebimentos subsequentes no soquete serão não permitidos. Isso não tem efeito nas camadas de protocolo inferiores.
Para o protocolo TCP, a janela TCP não é alterada e os dados de entrada serão aceitos (mas não reconhecidos) até que a janela seja esgotada. Para Protocolo de Datagrama do Usuário (UDP), os datagramas de entrada são aceitos e enfileirados. Em nenhum caso será gerado um pacote de erro ICMP. Se nHow for 1, os envios subsequentes não serão permitidos. Para soquetes TCP, um FIN será enviado. A configuração nHow como 2 desabilita os envios e os recebimentos, conforme descrito acima.
Observe que ShutDown não fecha o soquete e os recursos anexados ao soquete não serão liberados até que Close seja chamado. Um aplicativo não deve depender de ser capaz de reutilizar um soquete depois de ser desligado. Em particular, uma implementação do Windows Sockets não é necessária para dar suporte ao uso de Connect nesse soquete.
Exemplo
Confira o exemplo de CAsyncSocket::OnReceive.
CASyncSocket::Socket
Aloca um identificador de soquete.
BOOL Socket(
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0,
int nAddressFormat = PF_INET);
Parâmetros
nSocketType
Especifica SOCK_STREAM ou SOCK_DGRAM.
lEvent
Uma máscara de bits, a qual especifica uma combinação de eventos de rede em que o aplicativo está interessado.
FD_READ: deseja receber uma notificação de preparação para leitura.FD_WRITE: deseja receber uma notificação de preparação para escrita.FD_OOB: deseja receber uma notificação da chegada de dados fora da banda.FD_ACCEPT: deseja receber uma notificação de conexões de entrada.FD_CONNECT: deseja receber notificação de conexão concluída.FD_CLOSE: deseja receber uma notificação de fechamento do soquete.
nProtocolType
Protocolo a ser usado com o soquete específico para a família de endereços indicada.
nAddressFormat
Especificação da família de endereços.
Valor de retorno
Retornará TRUE se for bem-sucedido, FALSE em caso de falha.
Comentários
Esse método aloca um identificador de soquete. Ele não chama CAsyncSocket::Bind para associar o soquete a um endereço especificado, portanto, você precisa chamar Bind mais tarde para associar o soquete a um endereço especificado. Você pode usar CAsyncSocket::SetSockOpt para definir a opção de soquete antes que ela seja associada.
Confira também
Classe CObject
Gráfico da hierarquia
Classe CSocket
Classe CSocketFile