Compartilhar via


CAsyncSocket::ReceiveFrom

Chamar essa função de membro para receber uma datagrama e para armazenar o endereço de origem na estrutura de 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 comprimento de lpBuf em bytes.

  • rSocketAddress
    Referência a um objeto de CString que recebe um endereço IP pontilhada de números.

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

  • lpSockAddr
    Um ponteiro a estrutura de SOCKADDR que contém o endereço de origem na parte superior de retorno.

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

  • nFlags
    Especifica a maneira na qual o chamada é feita. A semântica de essa função é determinada pelas opções de soquete e pelo parâmetro de nFlags . O segundo é construído combinando alguns dos seguintes valores com o operador de OR C++:

    • Auge deMSG_PEEK nos dados de entrada. Os dados são copiados para o buffer mas não removidos da fila de entrada.

    • Dados de banda fora de processo deMSG_OOB .

Valor de retorno

Se nenhum erro ocorre, ReceiveFrom retorna o número de bytes recebidos. Se a conexão foi fechada, retornará 0. Caso contrário, um valor de 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 A AfxSocketInit com êxito deve ocorrer antes de usar este API.

  • WSAENETDOWN a implementação da do windows detectou que o subsistema de rede falhou.

  • WSAEFAULT o argumento de lpSockAddrLen era inválido: o buffer de lpSockAddr foi muito pequeno acomodar o endereço do ponto.

  • A operação de soquetes do windows de bloqueio deWSAEINPROGRESS A está em andamento.

  • WSAEINVAL o soquete não foi associado com Ligar.

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

  • WSAENOTSOCK o descritor não for um soquete.

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

  • WSAESHUTDOWN o soquete foi fechada; não é possível chamar ReceiveFrom em um soquete após ShutDown foi chamado com nHow definido como 0 ou 2.

  • WSAEWOULDBLOCK o soquete é marcado como nonblocking e a operação de ReceiveFrom bloquearia.

  • WSAEMSGSIZE a datagrama foi muito grande caber no buffer foi especificado e truncado.

  • WSAECONNABORTED o circuito virtual foi anuladas devido ao tempo limite ou outra falha.

  • WSAECONNRESET o circuito virtual foi redefinido pelo lado do servidor remoto.

Comentários

Essa função é usada para ler dados de entrada em soquete de conectado (possivelmente) e detectar o endereço dos dados que foram enviados.

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

Para os soquetes de tipo SOCK_STREAM, tanta informação quanto está disponível no momento até o tamanho do buffer fornecido é retornada. Se o soquete foi configurado para receptor in-line de dados fora de banda (padrão SO_OOBINLINEde soquete) e os dados fora de banda são unread, somente os dados fora de banda serão retornados. O aplicativo pode usar a opção ou OnOutOfBandData de IOCtlSIOCATMARK determinar se any outras dados fora de banda permanecem ser lidos. Os parâmetros de lpSockAddr e de lpSockAddrLen são ignorados para os soquetes de SOCK_STREAM .

Para os soquetes de datagrama, os dados são extraídos da primeira datagrama enviada para a fila, até o tamanho do buffer fornecido. Se a datagrama é maior do que o buffer fornecido, o buffer é preenchido com a primeira parte de mensagem, os dados adicionais são perdidos, e retornos de ReceiveFrom um valor de SOCKET_ERROR com o código de erro definido como WSAEMSGSIZE.

Se lpSockAddr é diferente de zero, e o soquete é do tipo SOCK_DGRAM, o endereço de rede de soquete que envia os dados é copiado para a estrutura de SOCKADDR correspondente. O valor apontado por lpSockAddrLen é inicializado para o tamanho de essa estrutura, e modificado em retorno para indicar o tamanho real de endereço armazenado localmente. Se nenhum dados de entrada está disponível em soquete, a chamada de ReceiveFrom espera dados para chegar a menos que o soquete é nonblocking. Em esse caso, um valor de SOCKET_ERROR é retornado pelo código de erro definido como WSAEWOULDBLOCK. O retorno de chamada de OnReceive pode ser usado para determinar quando dados mais chegam.

Se o soquete é do tipo SOCK_STREAM e o lado do servidor remoto desliga graciosamente a conexão, ReceiveFrom concluirá imediatamente com os 0 bytes recebidos.

Requisitos

Cabeçalho: afxsock.h

Consulte também

Referência

Classe CAsyncSocket

Gráfico da hierarquia

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::Receive

CAsyncSocket::Send