Partilhar via


CAsyncSocket Classe

Representa um Windows Socket — 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 uma alça de soquete a um CAsyncSocket objeto.
CAsyncSocket::Bind Associa um endereço local ao soquete.
CAsyncSocket::Close Fecha o soquete.
CAsyncSocket::Connect Estabelece uma conexão com um soquete de mesmo nível.
CAsyncSocket::Create Cria um soquete.
CAsyncSocket::CreateEx Cria um soquete com opções avançadas.
CAsyncSocket::Detach Desanexa uma alça de soquete de um CAsyncSocket objeto.
CAsyncSocket::FromHandle Retorna um ponteiro para um CAsyncSocket objeto, 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 de mesmo nível ao qual o soquete está conectado.
CAsyncSocket::GetPeerNameEx Obtém o endereço do soquete de mesmo nível ao qual o soquete está conectado (lida com 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 datagrama e armazena o endereço de origem (lida com 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 (lida com endereços IPv6).
CAsyncSocket::SetSockOpt Define uma opção de soquete.
CAsyncSocket::ShutDown Desativa Send e/ou Receive chama o soquete.
CASyncSocket::Socket Aloca uma alça 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 por engano.
CAsyncSocket::OnOutOfBandData Notifica um soquete de recebimento de que há dados fora de banda para 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::operador = Atribui um novo valor a um CAsyncSocket objeto.
CAsyncSocket::operador SOCKET Use este operador para recuperar o SOCKETCAsyncSocket identificador do objeto.

Membros de Dados Públicos

Nome Descrição
CAsyncSocket::m_hSocket Indica o identificador anexado SOCKET a este CAsyncSocket objeto.

Observações

Class CAsyncSocket encapsula a API de funções de soquete do Windows, fornecendo uma abstração orientada a objetos para programadores que desejam usar o Windows Sockets em conjunto com o MFC.

Esta classe baseia-se no pressuposto de que compreende 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 classe CSocket.

Para usar um CAsyncSocket objeto, chame seu construtor e, em seguida, chame a Create função para criar o identificador de soquete subjacente (tipo SOCKET), exceto em soquetes aceitos. Para um soquete de servidor, chame a Listen função de membro e, para um soquete de cliente, chame a Connect função de membro. O soquete do servidor deve chamar a Accept função ao receber uma solicitação de conexão. Use as funções restantes CAsyncSocket para realizar comunicações entre tomadas. Após a conclusão, destrua o CAsyncSocket objeto se ele foi criado na pilha, o destruidor chama automaticamente a Close função. O SOCKET tipo de dados é descrito no artigo Windows Sockets: Background.

Observação

Ao usar soquetes MFC em threads secundários em um aplicativo MFC vinculado estaticamente, você deve chamar AfxSocketInit cada thread que usa soquetes para inicializar as bibliotecas de soquetes. Por padrão, AfxSocketInit é chamado apenas no thread primário.

Para obter mais informações, consulte Windows Sockets: Usando classe CAsyncSocket e artigos relacionados., bem como API do Windows Sockets 2.

Hierarquia de herança

CObject

CAsyncSocket

Requerimentos

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 que está disponível para conexão.

lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que recebe o endereço do soquete de conexão, conforme conhecido na rede. O formato exato do lpSockAddr argumento é 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 bytes. O lpSockAddrLen é um parâmetro valor-resultado: ele deve conter inicialmente a quantidade de espaço apontado 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento é muito pequeno (menor do que o tamanho de uma SOCKADDR estrutura).

  • WSAEINPROGRESS Uma chamada de bloqueio do Windows Sockets está em andamento.

  • WSAEINVAL Listen não foi invocado antes da aceitação.

  • WSAEMFILE A fila está vazia na entrada para aceitar e não há descritores disponíveis.

  • WSAENOBUFS Não há espaço de buffer disponível.

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP O soquete referenciado não é um tipo que oferece suporte a serviço orientado a conexão.

  • WSAEWOULDBLOCK O soquete está marcado como sem bloqueio e nenhuma conexão está presente para ser aceito.

Observações

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 ao 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. A tomada original permanece aberta e ouvindo.

O argumento lpSockAddr é um parâmetro de resultado que é preenchido com o endereço do soquete de conexão, como conhecido para a 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 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 nos quais o aplicativo está interessado.

  • FD_READ Deseja receber notificação de prontidão para leitura.

  • FD_WRITE Deseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.

  • FD_OOB Deseja receber notificação da chegada de dados fora de banda.

  • FD_ACCEPT Deseja receber notificações de conexões de entrada.

  • FD_CONNECT Deseja receber notificação dos resultados da conexão.

  • FD_CLOSE Deseja receber uma notificação quando um soquete for 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou 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.

Observações

Esta 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 este soquete para o modo sem bloqueio. 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 hSocket identificador a um CAsyncSocket objeto.

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parâmetros

hSocket
Contém uma alça para um soquete.

lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.

  • FD_READ Deseja receber notificação de prontidão para leitura.

  • FD_WRITE Deseja receber uma notificação quando os dados estiverem disponíveis para serem lidos.

  • FD_OOB Deseja receber notificação da chegada de dados fora de banda.

  • FD_ACCEPT Deseja receber notificações de conexões de entrada.

  • FD_CONNECT Deseja receber notificação dos resultados da conexão.

  • FD_CLOSE Deseja receber uma notificação quando um soquete for fechado por um par.

Valor de retorno

Diferente de zero se a função for bem-sucedida.

Observações

O SOCKET identificador é armazenado no membro de dados do m_hSocket objeto.

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 pontilhado como "128.56.22.8". Passar a NULL cadeia de caracteres para esse parâmetro indica que a instância deve escutar a CAsyncSocket atividade do cliente em todas as interfaces de rede.

lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que contém o endereço a ser atribuído a esse soquete.

nSockAddrLen
O comprimento do endereço em lpSockAddr 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 abrange alguns dos erros que podem ser retornados. Para obter uma lista completa, consulte Códigos de erro de soquetes do Windows.

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEADDRINUSE O endereço especificado já está em uso. (Consulte a opção de soquete SO_REUSEADDR em SetSockOpt.)

  • WSAEFAULT O nSockAddrLen argumento é muito pequeno (menor do que o tamanho de uma SOCKADDR estrutura).

  • WSAEINPROGRESS Uma chamada de bloqueio do Windows Sockets está em andamento.

  • WSAEAFNOSUPPORT A família de endereços especificada não é suportada por esta porta.

  • WSAEINVAL O soquete já está vinculado a um endereço.

  • WSAENOBUFS Não há buffers suficientes disponíveis, muitas conexões.

  • WSAENOTSOCK O descritor não é um soquete.

Observações

Essa rotina é usada em um datagrama desconectado ou soquete Connect de fluxo, antes de chamadas subsequentesListen. Antes de aceitar solicitações de conexão, um soquete de servidor de escuta deve selecionar um número de porta e torná-lo conhecido ao 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();

Observações

Depois de construir o objeto, você deve chamar sua Create função de membro para criar a estrutura de SOCKET dados e vincular seu endereço. (No lado do servidor de uma comunicação do Windows Sockets, quando o soquete de escuta cria um soquete para usar na Accept chamada, você não chama Create esse soquete.)

CAsyncSocket::Close

Fecha o soquete.

virtual void Close();

Observações

Esta função libera o descritor de soquete para que outras referências a ele falhem com o erro WSAENOTSOCK. Se esta 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 por você.

Para CAsyncSocket, mas não para CSocket, a semântica de são afetadas pelas opções Close de SO_LINGER soquete e SO_DONTLINGER. Para obter mais informações, consulte a função GetSockOptde membro .

CAsyncSocket::Connect

Chame essa função de membro para estabelecer uma conexão com um fluxo desconectado 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 máquina, 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 SOCKADDR estrutura que contém o endereço do soquete conectado.

nSockAddrLen
O comprimento do endereço em lpSockAddr 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 de , e seu aplicativo estiver usando os retornos de chamada substituíveis, seu aplicativo receberá uma WSAEWOULDBLOCK mensagem quando a operação de OnConnectconexão for concluída. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEADDRINUSE O endereço especificado já está em uso.

  • WSAEINPROGRESS Uma chamada de bloqueio do Windows Sockets está em andamento.

  • WSAEADDRNOTAVAIL O endereço especificado não está disponível na máquina local.

  • WSAEAFNOSUPPORT Os endereços da família especificada não podem ser usados com esse soquete.

  • WSAECONNREFUSED A tentativa de conexão foi rejeitada.

  • WSAEDESTADDRREQ É necessário um endereço de destino.

  • WSAEFAULT O nSockAddrLen argumento está incorreto.

  • WSAEINVAL Endereço de host inválido.

  • WSAEISCONN O soquete já está conectado.

  • WSAEMFILE Não estão disponíveis mais descritores de ficheiros.

  • WSAENETUNREACH A rede não pode ser acessada a partir deste host no momento.

  • WSAENOBUFS Não há espaço de buffer disponível. O soquete não pode ser conectado.

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAETIMEDOUT A tentativa de conexão atingiu o tempo limite sem estabelecer uma conexão.

  • WSAEWOULDBLOCK O soquete está marcado como sem bloqueio e a conexão não pode ser concluída imediatamente.

Observações

Se o soquete não estiver vinculado, valores exclusivos serão atribuídos à associação local pelo sistema e o soquete será marcado como vinculado. Observe que, se o campo de endereço da estrutura de nomes for todos zeros, Connect retornará zero. Para obter informações de erro estendidas, chame a GetLastError função de membro.

Para soquetes de fluxo (tipo SOCK_STREAM), uma conexão ativa é iniciada com o host estrangeiro. Quando a chamada de soquete for concluída com êxito, o soquete estará pronto para enviar/receber dados.

Para um soquete SOCK_DGRAM de datagrama (tipo Send), um destino padrão é definido, que será usado em chamadas e subsequentesReceive.

CAsyncSocket::Create

Chame a Create função de membro 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 bem conhecida para ser usada com o soquete, ou 0 se você quiser que o Windows Sockets selecione uma porta.

nSocketType
SOCK_STREAM ou SOCK_DGRAM.

lEvent
Uma máscara de bits que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.

  • FD_READ Deseja receber notificação de prontidão para leitura.

  • FD_WRITE Deseja receber notificação de prontidão para escrever.

  • FD_OOB Deseja receber notificação da chegada de dados fora de banda.

  • FD_ACCEPT Deseja receber notificações de conexões de entrada.

  • FD_CONNECT Deseja receber notificação de conexão concluída.

  • FD_CLOSE Deseja receber notificação de fechamento de soquete.

lpszSockAddress
Um ponteiro para uma cadeia de caracteres que contém o endereço de rede do soquete conectado, um número pontilhado como "128.56.22.8". Passar a NULL cadeia de caracteres para esse parâmetro indica que a instância deve escutar a CAsyncSocket atividade do cliente em todas as 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEAFNOSUPPORT A família de endereços especificada não é suportada.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAEMFILE Não estão disponíveis mais descritores de ficheiros.

  • WSAENOBUFS Não há 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 tipo de soquete especificado não é suportado nesta família de endereços.

Observações

Create chamadas Socket e, se bem-sucedida, chama Bind para vincular o soquete ao endereço especificado. Os seguintes tipos de soquete são suportados:

  • SOCK_STREAM Fornece fluxos de bytes sequenciados, confiáveis, full-duplex e baseados em conexão. Usa o protocolo TCP (Transmission Control Protocol) 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 Accept função member usa uma referência a um novo objeto vazio CSocket como parâmetro. Você deve construir este objeto antes de chamar Accept. Lembre-se de que, se esse objeto de soquete sair do escopo, a conexão será fechada. Não chame Create esse novo objeto de soquete.

Importante

Create não é seguro para threads. Se você estiver chamando-o em um ambiente multi-threaded onde 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: Plano de fundo e Windows Sockets: portas e endereços de soquete e API do Windows Sockets 2.

CAsyncSocket::CreateEx

Chame a CreateEx função de membro depois de construir um objeto de soquete para criar o soquete do Windows e anexá-lo.

Use esta 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 armazenar 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 nos quais o aplicativo está interessado.

  • FD_READ Deseja receber notificação de prontidão para leitura.

  • FD_WRITE Deseja receber notificação de prontidão para escrever.

  • FD_OOB Deseja receber notificação da chegada de dados fora de banda.

  • FD_ACCEPT Deseja receber notificações de conexões de entrada.

  • FD_CONNECT Deseja receber notificação de conexão concluída.

  • FD_CLOSE Deseja receber notificação de fechamento de soquete.

Valor de retorno

Consulte o valor de retorno para Create().

Observações

Ver as observações para Create().

CAsyncSocket::Detach

Chame essa função de membro para desanexar o SOCKET identificador no m_hSocket membro de dados do CAsyncSocket objeto e defina m_hSocket como NULL.

SOCKET Detach();

CAsyncSocket::FromHandle

Retorna um ponteiro para um CAsyncSocket objeto.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parâmetros

hSocket
Contém uma alça para um soquete.

Valor de retorno

Um ponteiro para um CAsyncSocket objeto ou NULL se não houver nenhum CAsyncSocket objeto anexado ao hSocket.

Observações

Quando recebe uma SOCKET alça, se um CAsyncSocket objeto não estiver anexado à alça, 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 de retorno indica o código de erro para a última rotina de API do Windows Sockets executada por esse thread.

Observações

Quando uma função de membro específica indica que ocorreu um erro, GetLastError deve ser chamado para recuperar o código de erro apropriado. Consulte as descrições das funções de membro individuais para obter uma lista de códigos de erro aplicáveis.

Para obter mais informações sobre os códigos de erro, consulte API do Windows Sockets 2.

CAsyncSocket::GetPeerName

Chame essa função de membro para obter o endereço do soquete de mesmo nível 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 CString objeto que recebe um endereço IP de número pontilhado.

rPeerPort
Referência a um UINT que armazena uma porta.

lpSockAddr
Um ponteiro para a SOCKADDR estrutura que recebe o nome do soquete de mesmo nível.

lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr bytes. Ao retornar, o lpSockAddrLen argumento contém o tamanho real do lpSockAddr retorno 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento não é suficientemente grande.

  • 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.

Observações

Para manipular endereços IPv6, use CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Chame essa função de membro para obter o endereço do soquete de mesmo nível ao qual esse soquete está conectado (lida com endereços IPv6).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Parâmetros

rPeerAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.

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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento não é suficientemente grande.

  • 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.

Observações

Esta função é a mesma CAsyncSocket::GetPeerName , exceto que lida com 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 CString objeto que recebe um endereço IP de número pontilhado.

rSocketPort
Referência a um UINT que armazena uma porta.

lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que recebe o endereço do soquete.

lpSockAddrLen
Um ponteiro para o comprimento do endereço em lpSockAddr 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento não é suficientemente grande.

  • 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 vinculado a um endereço com Bind.

Observações

Esta chamada é especialmente útil quando uma Connect chamada foi feita sem fazer uma Bind primeira, esta chamada fornece o único meio pelo qual você pode determinar a associação local que foi definida pelo sistema.

Para manipular 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 CString objeto que recebe um endereço IP de número pontilhado.

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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento não é suficientemente grande.

  • 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 vinculado a um endereço com Bind.

Observações

Esta chamada é a mesma CAsyncSocket::GetSockName , exceto que ela lida com endereços IPv6, bem como protocolos mais antigos.

Esta chamada é especialmente útil quando uma Connect chamada foi feita sem fazer uma Bind primeira, esta chamada fornece o único meio pelo qual 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, este será o tamanho de uma LINGER estrutura, para todas as outras opções será o tamanho de um BOOL ou um int, dependendo da opção. Veja a lista de opções e seus tamanhos na seção Observações.

lpOptionLen
Um ponteiro para o tamanho do lpOptionValue buffer em bytes.

nLevel
O nível a que a opção é definida; os únicos níveis suportados 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 foi definida com SetSockOpt, então GetSockOpt retorna o valor padrão para a opção. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpOptionLen argumento era inválido.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAENOPROTOOPT A opção é desconhecida ou não é suportada. Em particular, SO_BROADCAST não é suportado em soquetes do tipo SOCK_STREAM, enquanto SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER, e SO_OOBINLINE não são suportados em soquetes do tipo SOCK_DGRAM.

  • WSAENOTSOCK O descritor não é um soquete.

Observações

GetSockOpt Recupera o valor atual de 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, transferência de dados fora de banda e assim por diante.

As seguintes opções são suportadas para GetSockOpt. O Tipo identifica o tipo de dados abordados pelo lpOptionValue. A TCP_NODELAY opção usa nível IPPROTO_TCP, todas as outras opções usam nível SOL_SOCKET.

Valor Tipo Significado
SO_ACCEPTCONN BOOL Socket está ouvindo.
SO_BROADCAST BOOL O soquete é configurado para a transmissão de mensagens de difusão.
SO_DEBUG BOOL A depuração está ativada.
SO_DONTLINGER BOOL Se true, a opção está desativada SO_LINGER .
SO_DONTROUTE BOOL O roteamento está desativado.
SO_ERROR int Recupere o status do erro e limpe.
SO_KEEPALIVE BOOL Keep-alives estão sendo enviados.
SO_LINGER struct LINGER Retorna as opções de permanência atuais.
SO_OOBINLINE BOOL 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 vinculado a um endereço que já está em uso.
SO_SNDBUF int Tamanho do buffer para envios.
SO_TYPE int O tipo de soquete (por exemplo, SOCK_STREAM).
TCP_NODELAY BOOL Desativa o algoritmo Nagle para enviar coalescência.

As opções de Berkeley Software Distribution (BSD) não suportadas são GetSockOpt :

Valor Tipo Significado
SO_RCVLOWAT int Receba marca d'água baixa.
SO_RCVTIMEO int Receba o tempo limite.
SO_SNDLOWAT int Envie marca d'água baixa.
SO_SNDTIMEO int Tempo limite de envio.
IP_OPTIONS Obter opções no cabeçalho IP.
TCP_MAXSEG int Obtenha o tamanho máximo do segmento TCP.

Chamar GetSockOpt com uma opção não suportada resultará em um código de erro de WSAENOPROTOOPT ser retornado do 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 para 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEINVAL lCommand não é um comando válido, ou lpArgument não é um parâmetro aceitável para lCommand, 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.

Observações

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 protocolo e subsistema de comunicações. Os seguintes comandos são suportados:

  • FIONBIO Habilite ou desative o modo sem bloqueio no soquete. O lpArgument parâmetro aponta para um DWORD, que é diferente de zero se o modo sem bloqueio deve ser ativado e zero se ele deve ser desativado. Se AsyncSelect tiver sido emitido em um soquete, qualquer tentativa de usar IOCtl para definir o soquete de volta ao modo de bloqueio falhará com WSAEINVALo . Para definir o soquete de volta ao modo de bloqueio e evitar o WSAEINVAL erro, um aplicativo deve primeiro desativar AsyncSelect chamando AsyncSelect com o lEvent parâmetro igual a 0 e, em seguida, chamar IOCtl.

  • FIONREAD Determine o número máximo de bytes que podem ser lidos com uma Receive chamada desse soquete. O lpArgument parâmetro aponta para um DWORD em que IOCtl armazena o resultado. Se este soquete for do tipo SOCK_STREAM, FIONREAD retorna a quantidade total de dados que podem ser lidos em um único Receive, que normalmente é o mesmo que a quantidade total de dados enfileirados no soquete. Se esse soquete for do tipo SOCK_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 tipo SOCK_STREAM que foi configurado para receção em linha de quaisquer dados fora de banda (SO_OOBINLINE). Se nenhum dado fora de banda estiver aguardando para ser lido, a operação retornará diferente de zero. Caso contrário, ele retorna 0, e o próximo Receive ou ReceiveFrom executado no soquete recuperará alguns ou todos os dados anteriores à "marca", o aplicativo deve usar a SIOCATMARK operação para determinar se algum dado permanece. Se houver algum dado normal que precede os dados "urgentes" (fora de banda), ele será recebido em ordem. (Observe que um Receive ou ReceiveFrom nunca misturará dados fora de banda e dados normais na mesma chamada.) O lpArgument parâmetro aponta para um DWORD em que IOCtl armazena o resultado.

Esta função é um subconjunto de como usado em soquetes de ioctl() Berkeley. Em particular, não há nenhum comando que seja equivalente a FIOASYNC, enquanto SIOCATMARK é o único comando de nível de soquete que é suportado.

CAsyncSocket::Listen

Chame essa função de membro para ouvir 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 crescer. 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEADDRINUSE Foi feita uma tentativa de ouvir um endereço em uso.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAEINVAL O soquete não foi vinculado Bind ou já está conectado.

  • WSAEISCONN O soquete já está conectado.

  • WSAEMFILE Não estão disponíveis mais descritores de ficheiros.

  • WSAENOBUFS Não há espaço de buffer disponível.

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP O soquete referenciado não é de um tipo que suporta a Listen operação.

Observações

Para aceitar conexões, o soquete é criado primeiro com Create, uma lista de pendências para conexões de entrada é especificada com Listene, em seguida, as conexões são aceitas com Accept. Listen aplica-se apenas a soquetes que suportam conexões, ou seja, aqueles do tipo SOCK_STREAM. Este soquete é colocado no modo "passivo", onde as conexões de entrada são reconhecidas e enfileiradas aguardando aceitação pelo processo.

Essa função é normalmente usada por servidores (ou qualquer aplicativo que queira aceitar conexões) que podem ter mais de uma solicitação de conexão ao mesmo tempo: 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 reabastecerá a fila para a "lista de pendências" atual ou mais recente, se possível, e retomará a escuta das conexões de entrada.

CAsyncSocket::m_hSocket

Contém o SOCKET identificador para o soquete encapsulado por este CAsyncSocket objeto.

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 à OnAccept função de membro:

  • 0 A função executada com êxito.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

Observações

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 à OnClose função de membro:

  • 0 A função executada com êxito.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAECONNRESET A conexão foi redefinida pelo lado remoto.

  • WSAECONNABORTED A conexão foi abortada devido ao tempo limite ou outra falha.

Observações

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 por engano.

virtual void OnConnect(int nErrorCode);

Parâmetros

nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnConnect função de membro:

  • 0 A função executada com êxito.

  • WSAEADDRINUSE O endereço especificado já está em uso.

  • WSAEADDRNOTAVAIL O endereço especificado não está disponível na máquina local.

  • WSAEAFNOSUPPORT Os endereços da família especificada não podem ser usados com esse soquete.

  • WSAECONNREFUSED A tentativa de conexão foi rejeitada com força.

  • WSAEDESTADDRREQ É necessário um endereço de destino.

  • WSAEFAULT O lpSockAddrLen argumento está incorreto.

  • WSAEINVAL O soquete já está vinculado a um endereço.

  • WSAEISCONN O soquete já está conectado.

  • WSAEMFILE Não estão disponíveis mais descritores de ficheiros.

  • WSAENETUNREACH A rede não pode ser acessada a partir deste host no momento.

  • WSAENOBUFS Não há 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 conexão expirou sem estabelecer uma conexão.

Observações

Observação

No CSocket, a função de OnConnect notificação nunca é chamada. Para conexões, basta ligar para Connect, que retornará quando a conexão for concluída (com êxito ou por engano). 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 de que o soquete de envio tem dados fora de banda para enviar.

virtual void OnOutOfBandData(int nErrorCode);

Parâmetros

nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnOutOfBandData função de membro:

  • 0 A função executada com êxito.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

Observações

Dados fora de banda são um canal logicamente independente que está associado a cada par de soquetes conectados do tipo SOCK_STREAM. O canal é geralmente usado para enviar dados urgentes.

MFC suporta dados fora de banda, mas os usuários de classe CAsyncSocket são desencorajados de usá-lo. 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 Receive função de membro.

virtual void OnReceive(int nErrorCode);

Parâmetros

nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnReceive função de membro:

  • 0 A função executada com êxito.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

Observações

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 que agora pode enviar dados chamando a Send função de membro.

virtual void OnSend(int nErrorCode);

Parâmetros

nErrorCode
O erro mais recente em um soquete. Os seguintes códigos de erro se aplicam à OnSend função de membro:

  • 0 A função executada com êxito.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

Observações

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 CAsyncSocket objeto.

void operator=(const CAsyncSocket& rSrc);

Parâmetros

rSrc
Uma referência a um objeto existente CAsyncSocket .

Observações

Chame essa função para copiar um objeto existente CAsyncSocket para outro CAsyncSocket objeto.

CAsyncSocket::operator SOCKET

Use este operador para recuperar o SOCKETCAsyncSocket identificador do objeto.

operator SOCKET() const;

Valor de retorno

Se for bem-sucedido, o identificador do SOCKET objeto, caso contrário, NULL.

Observações

Você pode usar o identificador para chamar 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 recebidos.

nBufLen
O comprimento de lpBuf em bytes.

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):

  • MSG_PEEK Espreite os dados recebidos. 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 não ocorrer nenhum erro, Receive devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou 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 tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar Receive um soquete depois ShutDown de ter sido invocado com nHow definido como 0 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a Receive operação bloquearia.

  • WSAEMSGSIZE O datagrama era muito grande para caber no buffer especificado e foi truncado.

  • WSAEINVAL O soquete não foi vinculado ao Bind.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

Observações

Esta função é usada para soquetes de fluxo ou datagrama conectados e é usada para ler dados de entrada.

Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido.

Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte do datagrama, os dados em excesso serão perdidos e Receive retornarão um valor de com o código de SOCKET_ERROR erro definido como WSAEMSGSIZE. Se nenhum dado de entrada estiver disponível no soquete, um valor de será retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. A OnReceive função de retorno de chamada 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 será concluído imediatamente com 0 bytes recebidos. Se a conexão tiver sido redefinida, um Receive falhará com o erro WSAECONNRESET.

Receive deve ser chamado apenas uma vez para cada vez CAsyncSocket::OnReceive que é chamado.

Exemplo

Veja o exemplo para CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Chame essa função de membro para receber um datagrama e armazenar o endereço de origem na SOCKADDR estrutura ou no 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 recebidos.

nBufLen
O comprimento de lpBuf em bytes.

rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.

rSocketPort
Referência a um UINT que armazena uma porta.

lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que mantém o endereço de origem no retorno.

lpSockAddrLen
Um ponteiro para o comprimento do endereço de origem em lpSockAddr bytes.

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):

  • MSG_PEEK Espreite os dados recebidos. 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 não ocorrer nenhum erro, ReceiveFrom devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento era inválido: o lpSockAddr buffer era muito pequeno para acomodar o endereço de mesmo nível.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAEINVAL O soquete não foi vinculado ao Bind.

  • WSAENOTCONN O soquete não está conectado (SOCK_STREAM apenas).

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP MSG_OOB foi especificado, mas o soquete não é do tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar ReceiveFrom um soquete depois ShutDown de ter sido invocado com nHow definido como 0 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a ReceiveFrom operação bloquearia.

  • WSAEMSGSIZE O datagrama era muito grande para caber no buffer especificado e foi truncado.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

Observações

Esta função é usada para ler dados recebidos em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.

Para manipular endereços IPv6, use CAsyncSocket::ReceiveFromEx.

Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido. Os lpSockAddr parâmetros e lpSockAddrLen são ignorados para SOCK_STREAM soquetes.

Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, os dados em excesso serão perdidos e ReceiveFrom retornará um valor de com o código de SOCKET_ERROR 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 é copiado para a estrutura correspondente SOCKADDR . 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 ReceiveFrom chamada aguardará a chegada dos dados, a menos que o soquete não esteja bloqueando. Nesse caso, um valor de é retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. O OnReceive retorno de chamada pode ser usado 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 será concluído 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 SOCKADDR estrutura 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 recebidos.

nBufLen
O comprimento de lpBuf em bytes.

rSocketAddress
Referência a um CString objeto que recebe um endereço IP de número pontilhado.

rSocketPort
Referência a um UINT que armazena uma porta.

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. Este último é construído combinando qualquer um dos seguintes valores com o operador OR bit a bit C ++ (|):

  • MSG_PEEK Espreite os dados recebidos. 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 não ocorrer nenhum erro, ReceiveFromEx devolve o número de bytes recebidos. Se a conexão tiver sido fechada, ela retornará 0. Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT O lpSockAddrLen argumento era inválido: o lpSockAddr buffer era muito pequeno para acomodar o endereço de mesmo nível.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAEINVAL O soquete não foi vinculado ao Bind.

  • WSAENOTCONN O soquete não está conectado (SOCK_STREAM apenas).

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP MSG_OOB foi especificado, mas o soquete não é do tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar ReceiveFromEx um soquete depois ShutDown de ter sido invocado com nHow definido como 0 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a ReceiveFromEx operação bloquearia.

  • WSAEMSGSIZE O datagrama era muito grande para caber no buffer especificado e foi truncado.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

Observações

Esta função é usada para ler dados recebidos em um soquete (possivelmente conectado) e capturar o endereço do qual os dados foram enviados.

Esta função é a mesma CAsyncSocket::ReceiveFrom , exceto que lida com endereços IPv6, bem como protocolos mais antigos.

Para soquetes do tipo SOCK_STREAM, todas as informações atualmente disponíveis até o tamanho do buffer fornecido são retornadas. Se o soquete tiver sido configurado para receção em linha de dados fora de banda (opção SO_OOBINLINEde soquete) e os dados fora de banda não forem lidos, somente os dados fora de banda serão retornados. O aplicativo pode usar a IOCtlSIOCATMARK opção ou OnOutOfBandData para determinar se mais algum dado fora de banda permanece para ser lido. Os lpSockAddr parâmetros e lpSockAddrLen são ignorados para SOCK_STREAM soquetes.

Para soquetes de datagrama, os dados são extraídos do primeiro datagrama enfileirado, até o tamanho do buffer fornecido. Se o datagrama for maior do que o buffer fornecido, o buffer será preenchido com a primeira parte da mensagem, os dados em excesso serão perdidos e ReceiveFromEx retornará um valor de com o código de SOCKET_ERROR 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 é copiado para a estrutura correspondente SOCKADDR . 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 ReceiveFromEx chamada aguardará a chegada dos dados, a menos que o soquete não esteja bloqueando. Nesse caso, um valor de é retornado com o código de SOCKET_ERROR erro definido como WSAEWOULDBLOCK. O OnReceive retorno de chamada pode ser usado 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 será concluído 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 contendo os dados a serem transmitidos.

nBufLen
O comprimento dos dados em lpBuf bytes.

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. 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 a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.

  • MSG_OOB Envie dados fora de banda (SOCK_STREAM apenas).

Valor de retorno

Se não ocorrer nenhum erro, Send devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou 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 lpBuf argumento 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 do Windows Sockets a descartou.

  • 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 tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar Send um soquete depois ShutDown de ter sido invocado com nHow definido como 1 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a operação solicitada bloquearia.

  • WSAEMSGSIZE O soquete é do tipo SOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.

  • WSAEINVAL O soquete não foi vinculado ao Bind.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

Observações

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 é dado pelo iMaxUdpDg elemento na WSADATA estrutura retornado pelo AfxSocketInit. Se os dados forem muito longos para passar atomicamente pelo protocolo subjacente, o erro WSAEMSGSIZE será retornado via 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 CAsyncSocket objetos do tipo SOCK_STREAM, o número de bytes gravados pode estar entre 1 e o comprimento solicitado, dependendo da disponibilidade do buffer nos hosts locais e estrangeiros.

Exemplo

Veja o exemplo para 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 contendo os dados a serem transmitidos.

nBufLen
O comprimento dos dados em lpBuf 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 máquina como "ftp.microsoft.com" ou um número pontilhado como "128.56.22.8".

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. 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 a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.

  • MSG_OOB Envie dados fora de banda (SOCK_STREAM apenas).

lpSockAddr
Um ponteiro para uma SOCKADDR estrutura que contém o endereço do soquete de destino.

nSockAddrLen
O comprimento do endereço em lpSockAddr bytes.

Valor de retorno

Se não ocorrer nenhum erro, SendTo devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou 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 lpBuf parâmetros ou lpSockAddr não fazem parte do espaço de endereçamento do usuário ou o lpSockAddr argumento é muito pequeno (menor que o tamanho de uma SOCKADDR estrutura).

  • WSAEINVAL O nome do host é inválido.

  • WSAENETRESET A conexão deve ser redefinida porque a implementação do Windows Sockets a descartou.

  • WSAENOBUFS A implementação do Windows Sockets relata um deadlock de buffer.

  • WSAENOTCONN O soquete não está conectado (SOCK_STREAM apenas).

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP MSG_OOB foi especificado, mas o soquete não é do tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar SendTo um soquete depois ShutDown de ter sido invocado com nHow definido como 1 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a operação solicitada bloquearia.

  • WSAEMSGSIZE O soquete é do tipo SOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

  • WSAEADDRNOTAVAIL O endereço especificado não está disponível na máquina local.

  • WSAEAFNOSUPPORT Os endereços da família especificada não podem ser usados com esse soquete.

  • WSAEDESTADDRREQ É necessário um endereço de destino.

  • WSAENETUNREACH A rede não pode ser acessada a partir deste host no momento.

Observações

SendTo é usado em datagrama ou soquetes de fluxo 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 é dado pelo iMaxUdpDg elemento na WSADATA estrutura 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 SOCK_DGRAM soquete para enviar um datagrama para um soquete lpSockAddr específico identificado pelo parâmetro.

Para enviar uma transmissão (em um SOCK_DGRAM apenas), o lpSockAddr endereço no parâmetro deve ser construído usando o endereço INADDR_BROADCAST IP especial (definido no arquivo WINSOCK.Hde cabeçalho do Windows Sockets) juntamente com o número da porta pretendida. Ou, se o lpszHostAddress parâmetro for NULL, o soquete está configurado para difusão. Geralmente, não é aconselhável que um datagrama de difusão exceda o tamanho no qual a fragmentação pode ocorrer, o que implica que a parte de dados do datagrama (excluindo cabeçalhos) não deve exceder 512 bytes.

Para manipular 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 contendo os dados a serem transmitidos.

nBufLen
O comprimento dos dados em lpBuf 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 máquina como "ftp.microsoft.com" ou um número pontilhado como "128.56.22.8".

nFlags
Especifica a maneira como a chamada é feita. A semântica desta função é determinada pelas opções de soquete e pelo nFlags parâmetro. 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 a roteamento. Um fornecedor de Windows Sockets pode optar por ignorar esse sinalizador.

  • MSG_OOB Envie dados fora de banda (SOCK_STREAM apenas).

Valor de retorno

Se não ocorrer nenhum erro, SendToEx devolve o número total de carateres enviados. (Observe que isso pode ser menor do que o número indicado por nBufLen.) Caso contrário, um valor de é retornado e um código de erro específico pode ser recuperado SOCKET_ERROR chamando GetLastError. Os seguintes erros aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou 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 lpBuf parâmetros ou lpSockAddr não fazem parte do espaço de endereçamento do usuário ou o lpSockAddr argumento é muito pequeno (menor que o tamanho de uma SOCKADDR estrutura).

  • WSAEINVAL O nome do host é inválido.

  • WSAENETRESET A conexão deve ser redefinida porque a implementação do Windows Sockets a descartou.

  • WSAENOBUFS A implementação do Windows Sockets relata um deadlock de buffer.

  • WSAENOTCONN O soquete não está conectado (SOCK_STREAM apenas).

  • WSAENOTSOCK O descritor não é um soquete.

  • WSAEOPNOTSUPP MSG_OOB foi especificado, mas o soquete não é do tipo SOCK_STREAM.

  • WSAESHUTDOWN A tomada foi desligada; Não é possível chamar SendToEx um soquete depois ShutDown de ter sido invocado com nHow definido como 1 ou 2.

  • WSAEWOULDBLOCK O soquete está marcado como não bloqueando e a operação solicitada bloquearia.

  • WSAEMSGSIZE O soquete é do tipo SOCK_DGRAM, e o datagrama é maior do que o máximo suportado pela implementação do Windows Sockets.

  • WSAECONNABORTED O circuito virtual foi abortado devido a tempo limite ou outra falha.

  • WSAECONNRESET O circuito virtual foi reiniciado pelo lado remoto.

  • WSAEADDRNOTAVAIL O endereço especificado não está disponível na máquina local.

  • WSAEAFNOSUPPORT Os endereços da família especificada não podem ser usados com esse soquete.

  • WSAEDESTADDRREQ É necessário um endereço de destino.

  • WSAENETUNREACH A rede não pode ser acessada a partir deste host no momento.

Observações

Este método é o mesmo CAsyncSocket::SendTo , exceto que ele lida com endereços IPv6, bem como protocolos mais antigos.

SendToEx é usado em datagrama ou soquetes de fluxo 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 é dado pelo iMaxUdpDg elemento na WSADATA estrutura 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 SOCK_DGRAM soquete para enviar um datagrama para um soquete lpSockAddr específico identificado pelo parâmetro.

Para enviar uma transmissão (em um SOCK_DGRAM apenas), o lpSockAddr endereço no parâmetro deve ser construído usando o endereço INADDR_BROADCAST IP especial (definido no arquivo WINSOCK.Hde cabeçalho do Windows Sockets) juntamente com o número da porta pretendida. Ou, se o lpszHostAddress parâmetro for NULL, o soquete está configurado para difusão. Geralmente, não é aconselhável que um datagrama de difusão exceda o tamanho no qual a fragmentação pode ocorrer, o que implica que a parte de dados do datagrama (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 para a opção solicitada é fornecido.

nOptionLen
O tamanho do lpOptionValue buffer em bytes.

nLevel
O nível a que a opção é definida; os únicos níveis suportados 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEFAULT lpOptionValue não está em uma parte válida do espaço de endereçamento 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ão lpOptionValue são válidas.

  • WSAENETRESET A conexão expirou quando SO_KEEPALIVE está definida.

  • WSAENOPROTOOPT A opção é desconhecida ou não é suportada. Em particular, SO_BROADCAST não é suportado em soquetes do tipo SOCK_STREAM, enquanto SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERe SO_OOBINLINE não são suportados em soquetes do tipo SOCK_DGRAM.

  • WSAENOTCONN A conexão foi redefinida quando SO_KEEPALIVE está definida.

  • WSAENOTSOCK O descritor não é um soquete.

Observações

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 mais alto 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 difusão podem ser enviadas no soquete e assim por diante.

Há dois tipos de opções de soquete: opções booleanas que habilitam ou desabilitam um recurso ou comportamento e opções que exigem um valor inteiro ou estrutura. Para habilitar uma opção booleana, lpOptionValue aponta para um inteiro diferente de zero. Para desativar a opção lpOptionValue aponta para um inteiro igual a zero. nOptionLen deve ser igual às sizeof(BOOL) opções booleanas. Para outras opções, lpOptionValue aponta para o inteiro ou estrutura que contém o valor desejado para a opção e nOptionLen é o comprimento do inteiro ou estrutura.

SO_LINGER Controla a ação executada quando dados não enviados são enfileirados em um soquete e a Close função é chamada para fechar o soquete.

Por padrão, um soquete não pode ser vinculado (consulte Bind) a um endereço local que já esteja em uso. Por vezes, porém, pode ser desejável "reutilizar" um endereço desta forma. Como cada conexão é identificada exclusivamente pela combinação de endereços locais e remotos, não há problema em ter dois soquetes vinculados ao mesmo endereço local, desde que os endereços remotos sejam diferentes.

Para informar a implementação do Windows Sockets de que uma Bind chamada em um soquete não deve ser desautorizada 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 Bind chamada. Observe que a opção é interpretada apenas no momento da Bind chamada: portanto, é desnecessário (mas inofensivo) definir a opção em um soquete que não deve ser vinculado a um endereço existente, e definir ou redefinir a opção após a Bind chamada não tem efeito sobre este ou qualquer outro soquete.

Um aplicativo pode solicitar que a implementação do Windows Sockets habilite o uso de pacotes "keep-alive" em conexões TCP (Transmission Control Protocol) ativando a SO_KEEPALIVE opção de soquete. Uma implementação do Windows Sockets não precisa suportar o 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 da RFC 1122: "Requisitos para hosts da Internet — camadas de comunicação". Se uma conexão for interrompida como resultado de "keep-alives", o código WSAENETRESET de erro será retornado para todas as chamadas em andamento no soquete, e todas as chamadas subsequentes falharão com WSAENOTCONNo .

A TCP_NODELAY opção desativa o algoritmo Nagle. O algoritmo Nagle é usado para reduzir o número de pequenos pacotes 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 criadores de aplicativos não devem definir TCP_NODELAY a menos que o impacto de fazê-lo seja bem compreendido e desejado, uma vez que a configuração TCP_NODELAY pode ter um impacto negativo significativo no desempenho da rede. TCP_NODELAY é a única opção de soquete suportada que usa nível IPPROTO_TCP, todas as outras opções usam nível SOL_SOCKET.

Algumas implementações do Windows Sockets fornecem informações de depuração de saída se a SO_DEBUG opção for definida por um aplicativo.

As seguintes opções são suportadas para SetSockOpt. O Tipo identifica o tipo de dados abordados pelo lpOptionValue.

Valor Tipo Significado
SO_BROADCAST BOOL Permitir a transmissão de mensagens de difusão no soquete.
SO_DEBUG BOOL Registre informações de depuração.
SO_DONTLINGER BOOL Não bloqueie Close a espera pelo envio de dados não enviados. Definir esta opção é equivalente a definir SO_LINGER com l_onoff definido como zero.
SO_DONTROUTE BOOL Não encaminhe: envie diretamente para a interface.
SO_KEEPALIVE BOOL Envie keep-alives.
SO_LINGER struct LINGER Aguarde Close se os 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 seja vinculado a um endereço que já esteja em uso. (Consulte Ligação.)
SO_SNDBUF int Especifique o tamanho do buffer para envios.
TCP_NODELAY BOOL Desativa o algoritmo Nagle para enviar coalescência.

As opções de Berkeley Software Distribution (BSD) não suportadas são SetSockOpt :

Valor Tipo Significado
SO_ACCEPTCONN BOOL O soquete está ouvindo
SO_ERROR int Obtenha o status do erro e limpe.
SO_RCVLOWAT int Receba marca d'água baixa.
SO_RCVTIMEO int Tempo limite de recebimento
SO_SNDLOWAT int Envie marca d'água baixa.
SO_SNDTIMEO int Tempo limite de envio.
SO_TYPE int Tipo de soquete.
IP_OPTIONS Definir campo de 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:

  • recebe = 0

  • envios = 1

  • ambos = 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 aplicam-se a esta função de membro:

  • WSANOTINITIALISED Um êxito AfxSocketInit deve ocorrer antes de usar esta API.

  • WSAENETDOWN A implementação do Windows Sockets detetou que o subsistema de rede falhou.

  • WSAEINVAL nHow não é válida.

  • WSAEINPROGRESS Uma operação de bloqueio do Windows Sockets está em andamento.

  • WSAENOTCONN O soquete não está conectado (SOCK_STREAM apenas).

  • WSAENOTSOCK O descritor não é um soquete.

Observações

ShutDown é usado em todos os tipos de tomadas para desativar a receção, transmissão ou ambos. Se nHow for 0, os recebimentos subsequentes no soquete não serão permitidos. Isso não tem efeito nas camadas de protocolo inferiores.

Para TCP (Transmission Control Protocol), a janela TCP não é alterada e os dados recebidos serão aceitos (mas não reconhecidos) até que a janela se esgote. Para UDP (User Datagram Protocol), 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 desativa os envios e os recebimentos conforme descrito acima.

Observe que não fecha o soquete e os recursos conectados ao soquete não serão liberados até ShutDown que Close seja chamado. Um aplicativo não deve depender da capacidade de reutilizar um soquete depois que ele for desligado. Em particular, uma implementação do Windows Sockets não é necessária para suportar o uso de Connect tal soquete.

Exemplo

Veja o exemplo para CAsyncSocket::OnReceive.

CASyncSocket::Socket

Aloca uma alça 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 que especifica uma combinação de eventos de rede nos quais o aplicativo está interessado.

  • FD_READ: Deseja receber notificação de prontidão para leitura.

  • FD_WRITE: Deseja receber notificação de prontidão para escrever.

  • FD_OOB: Deseja receber notificação da chegada de dados fora de banda.

  • FD_ACCEPT: Deseja receber notificações de conexões de entrada.

  • FD_CONNECT: Deseja receber notificação de conexão concluída.

  • FD_CLOSE: Deseja receber notificação de fechamento de 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

Retorna TRUE no sucesso, FALSE no fracasso.

Observações

Este método aloca um identificador de soquete. Ele não chama CAsyncSocket::Bind para vincular o soquete a um endereço especificado, então você precisa ligar Bind mais tarde para vincular o soquete a um endereço especificado. Você pode usar CAsyncSocket::SetSockOpt para definir a opção de soquete antes que ela seja vinculada.

Ver também

CObject Classe
Gráfico de Hierarquia
CSocket Classe
CSocketFile Classe