Classe CAsyncSocket
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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
é muito pequeno (menor que o tamanho de uma estruturaSOCKADDR
).WSAEINPROGRESS
Uma chamada de Bloqueio do Windows Sockets está em andamento.WSAEINVAL
Listen
não foi invocado antes de ser aceito.WSAEMFILE
A fila está vazia após a entrada a ser aceita e não há descritores disponíveis.WSAENOBUFS
Nenhum espaço de buffer disponível.WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
O soquete referenciado não é um tipo que dá suporte ao serviço orientado à conexão.WSAEWOULDBLOCK
O 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_READ
Deseja receber uma notificação de preparação para leitura.FD_WRITE
Deseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.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 a notificação dos resultados da conexão.FD_CLOSE
Deseja 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVAL
Indica que um dos parâmetros especificados era inválido.WSAEINPROGRESS
Uma 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_READ
Deseja receber uma notificação de preparação para leitura.FD_WRITE
Deseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.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 a notificação dos resultados da conexão.FD_CLOSE
Deseja 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.
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSE
O endereço especificado já está sendo usado. (Consulte a opção de soqueteSO_REUSEADDR
emSetSockOpt
.)WSAEFAULT
O argumentonSockAddrLen
é muito pequeno (menor que o tamanho de uma estruturaSOCKADDR
).WSAEINPROGRESS
Uma chamada de Bloqueio do Windows Sockets está em andamento.WSAEAFNOSUPPORT
A família de endereços especificada não tem suporte nessa porta.WSAEINVAL
O soquete já está associado a um endereço.WSAENOBUFS
Não há buffers suficientes disponíveis; muitas conexões.WSAENOTSOCK
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSE
O endereço especificado já está sendo usado.WSAEINPROGRESS
Uma chamada de Bloqueio do Windows Sockets está em andamento.WSAEADDRNOTAVAIL
O endereço especificado não está disponível no computador local.WSAEAFNOSUPPORT
Os endereços na família especificada não podem ser usados com este soquete.WSAECONNREFUSED
A tentativa de conexão foi rejeitada.WSAEDESTADDRREQ
Endereço de destino necessário.WSAEFAULT
O argumentonSockAddrLen
está incorreto.WSAEINVAL
Endereço de host inválido.WSAEISCONN
O soquete já está conectado.WSAEMFILE
Nenhum outro descritor de arquivo disponível.WSAENETUNREACH
A rede não pode ser alcançada através desse host neste momento.WSAENOBUFS
Nenhum espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTSOCK
O descritor não é um soquete.WSAETIMEDOUT
Tente se conectar com o tempo limite sem estabelecer uma conexão.WSAEWOULDBLOCK
O soquete é marcado como de não desbloqueio e a conexão não pode ser concluída imediatamente.
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_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.
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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEAFNOSUPPORT
A família de endereços especificada não tem suporte.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEMFILE
Nenhum outro descritor de arquivo disponível.WSAENOBUFS
Nenhum espaço de buffer disponível. O soquete não pode ser criado.WSAEPROTONOSUPPORT
A porta especificada não é suportada.WSAEPROTOTYPE
A porta especificada é o tipo errado para este soquete.WSAESOCKTNOSUPPORT
O 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_STREAM
Fornece 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_DGRAM
Suporta 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
Accept
faz uma referência a um novo objetoCSocket
vazio 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 chameCreate
para 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_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.
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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
não é grande o suficiente.WSAEINPROGRESS
Uma chamada de Bloqueio do Windows Sockets está em andamento.WSAENOTCONN
O soquete não está conectado.WSAENOTSOCK
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
não é grande o suficiente.WSAEINPROGRESS
Uma chamada de Bloqueio do Windows Sockets está em andamento.WSAENOTCONN
O soquete não está conectado.WSAENOTSOCK
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
não é grande o suficiente.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCK
O descritor não é um soquete.WSAEINVAL
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
não é grande o suficiente.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCK
O descritor não é um soquete.WSAEINVAL
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpOptionLen
era inválido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOPROTOOPT
A opção é desconhecida ou sem suporte. Em particular, não há suporte aSO_BROADCAST
em soquetes do tipoSOCK_STREAM
, enquantoSO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
eSO_OOBINLINE
não têm suporte em soquetes do tipoSOCK_DGRAM
.WSAENOTSOCK
O 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVAL
lCommand
não é um comando válido oulpArgument
não é um parâmetro aceitável paralCommand
, ou o comando não é aplicável ao tipo de soquete fornecido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCK
O 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:
FIONBIO
Habilitar ou desabilitar o modo de desbloqueio no soquete. O parâmetrolpArgument
aponta para umDWORD
, que não é zero se o modo de desbloqueio deve ser habilitado e zero se for para ser desabilitado. SeAsyncSelect
tiver sido emitido em um soquete, qualquer tentativa de usarIOCtl
para 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 desabilitarAsyncSelect
chamandoAsyncSelect
com o parâmetrolEvent
igual a 0 e, em seguida, chamarIOCtl
.FIONREAD
Determine o número máximo de bytes que podem ser lidos com uma chamadaReceive
desse soquete. O parâmetrolpArgument
aponta para umDWORD
em queIOCtl
armazena o resultado. Se esse soquete for do tipoSOCK_STREAM
,FIONREAD
retornará 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
,FIONREAD
retornará o tamanho do primeiro datagrama enfileirado no soquete.SIOCATMARK
Determine se todos os dados fora de banda foram lidos. Isso se aplica apenas a um soquete do tipoSOCK_STREAM
que foi configurado para 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óximoReceive
ouReceiveFrom
executado no soquete recuperará alguns ou todos os dados anteriores à "marca"; o aplicativo deve usar a operaçãoSIOCATMARK
para 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 umReceive
ouReceiveFrom
nunca misturará dados fora de banda e normais na mesma chamada.) O parâmetrolpArgument
aponta para umDWORD
em queIOCtl
armazena 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEADDRINUSE
Foi feita uma tentativa de escutar um endereço em uso.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEINVAL
O soquete não foi associado aBind
ou já está conectado.WSAEISCONN
O soquete já está conectado.WSAEMFILE
Nenhum outro descritor de arquivo disponível.WSAENOBUFS
Nenhum espaço de buffer disponível.WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
O 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.
WSAENETDOWN
A 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.
WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAECONNRESET
A conexão foi redefinida pelo lado remoto.WSAECONNABORTED
A 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.
WSAEADDRINUSE
O endereço especificado já está sendo usado.WSAEADDRNOTAVAIL
O endereço especificado não está disponível no computador local.WSAEAFNOSUPPORT
Os endereços na família especificada não podem ser usados com este soquete.WSAECONNREFUSED
A tentativa de conexão foi rejeitada de modo forçado.WSAEDESTADDRREQ
Endereço de destino necessário.WSAEFAULT
O argumentolpSockAddrLen
está incorreto.WSAEINVAL
O soquete já está associado a um endereço.WSAEISCONN
O soquete já está conectado.WSAEMFILE
Nenhum outro descritor de arquivo disponível.WSAENETUNREACH
A rede não pode ser alcançada através desse host neste momento.WSAENOBUFS
Nenhum espaço de buffer disponível. O soquete não pode ser conectado.WSAENOTCONN
O soquete não está conectado.WSAENOTSOCK
O descritor é um arquivo, não um soquete.WSAETIMEDOUT
A 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.
WSAENETDOWN
A 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.
WSAENETDOWN
A 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.
WSAENETDOWN
A 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_PEEK
Inspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOB
Processar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAENOTCONN
O soquete não está conectado.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarReceive
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 0 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operaçãoReceive
seria bloqueada.WSAEMSGSIZE
O datagrama era muito grande para caber no buffer especificado e foi truncado.WSAEINVAL
O soquete não foi associado aBind
.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O 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_PEEK
Inspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOB
Processar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
era inválido: o bufferlpSockAddr
era muito pequeno para acomodar o endereço par.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEINVAL
O soquete não foi associado aBind
.WSAENOTCONN
O soquete não está conectado (somenteSOCK_STREAM
).WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarReceiveFrom
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 0 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operaçãoReceiveFrom
seria bloqueada.WSAEMSGSIZE
O datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O 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_PEEK
Inspeção dos dados de entrada. Os dados são copiados para o buffer, mas não são removidos da fila de entrada.MSG_OOB
Processar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
O argumentolpSockAddrLen
era inválido: o bufferlpSockAddr
era muito pequeno para acomodar o endereço par.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEINVAL
O soquete não foi associado aBind
.WSAENOTCONN
O soquete não está conectado (somenteSOCK_STREAM
).WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarReceiveFromEx
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 0 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operaçãoReceiveFromEx
seria bloqueada.WSAEMSGSIZE
O datagrama era muito grande para caber no buffer especificado e foi truncado.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O 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_DONTROUTE
Especifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOB
Enviar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCES
O endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULT
O argumentolpBuf
não está em uma parte válida do espaço de endereço do usuário.WSAENETRESET
A conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFS
A implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONN
O soquete não está conectado.WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarSend
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 1 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZE
O soquete é do tipoSOCK_DGRAM
, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAEINVAL
O soquete não foi associado aBind
.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O 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_DONTROUTE
Especifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOB
Enviar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCES
O endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULT
Os parâmetroslpBuf
oulpSockAddr
não fazem parte do espaço de endereço do usuário ou o argumentolpSockAddr
é muito pequeno (menor que o tamanho de uma estruturaSOCKADDR
).WSAEINVAL
O nome de host é inválido.WSAENETRESET
A conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFS
A implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONN
O soquete não está conectado (somenteSOCK_STREAM
).WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarSendTo
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 1 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZE
O soquete é do tipoSOCK_DGRAM
, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O circuito virtual foi redefinido pelo lado remoto.WSAEADDRNOTAVAIL
O endereço especificado não está disponível no computador local.WSAEAFNOSUPPORT
Os endereços na família especificada não podem ser usados com este soquete.WSAEDESTADDRREQ
Endereço de destino necessário.WSAENETUNREACH
A 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_DONTROUTE
Especifica que os dados não devem estar sujeitos ao roteamento. Um fornecedor do Windows Sockets pode optar por ignorar esse sinalizador.MSG_OOB
Enviar 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEACCES
O endereço solicitado é um endereço de transmissão, mas o sinalizador apropriado não foi definido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEFAULT
Os parâmetroslpBuf
oulpSockAddr
não fazem parte do espaço de endereço do usuário ou o argumentolpSockAddr
é muito pequeno (menor que o tamanho de uma estruturaSOCKADDR
).WSAEINVAL
O nome de host é inválido.WSAENETRESET
A conexão deve ser redefinida porque a implementação dos Soquetes do Windows a retirou.WSAENOBUFS
A implementação do Windows Sockets relata um deadlock de buffer.WSAENOTCONN
O soquete não está conectado (somenteSOCK_STREAM
).WSAENOTSOCK
O descritor não é um soquete.WSAEOPNOTSUPP
MSG_OOB
foi especificado, mas o soquete não é do tipoSOCK_STREAM
.WSAESHUTDOWN
O soquete foi desligado; não é possível chamarSendToEx
em um soquete depois deShutDown
ter sido invocado comnHow
definido como 1 ou 2.WSAEWOULDBLOCK
O soquete é marcado como não desbloqueio e a operação solicitada seria bloqueada.WSAEMSGSIZE
O soquete é do tipoSOCK_DGRAM
, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.WSAECONNABORTED
O circuito virtual foi anulado devido ao tempo limite ou outra falha.WSAECONNRESET
O circuito virtual foi redefinido pelo lado remoto.WSAEADDRNOTAVAIL
O endereço especificado não está disponível no computador local.WSAEAFNOSUPPORT
Os endereços na família especificada não podem ser usados com este soquete.WSAEDESTADDRREQ
Endereço de destino necessário.WSAENETUNREACH
A 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEFAULT
lpOptionValue
não está em uma parte válida do espaço de endereço do processo.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAEINVAL
nLevel
não é válida ou as informações contidas nãolpOptionValue
são válidas.WSAENETRESET
A conexão atingiu o tempo limite quandoSO_KEEPALIVE
é definido.WSAENOPROTOOPT
A opção é desconhecida ou sem suporte. Em particular,SO_BROADCAST
não é suportado em soquetes de tipoSOCK_STREAM
, enquantoSO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
eSO_OOBINLINE
não são suportados em soquetes de tipoSOCK_DGRAM
.WSAENOTCONN
A conexão foi redefinida quandoSO_KEEPALIVE
é definido.WSAENOTSOCK
O 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
sends = 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:
WSANOTINITIALISED
UmAfxSocketInit
bem-sucedido deve ocorrer antes de usar essa API.WSAENETDOWN
A implementação do Windows Sockets detectou que o subsistema de rede falhou.WSAEINVAL
nHow
não é válido.WSAEINPROGRESS
Uma operação de bloqueio do Windows Sockets está em andamento.WSAENOTCONN
O soquete não está conectado (somenteSOCK_STREAM
).WSAENOTSOCK
O 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