Compartir a través de


CAsyncSocket::ReceiveFrom

Llame a esta función miembro para recibir un datagrama y almacenar la dirección de origen en la estructura de SOCKADDR o en 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
    un búfer para los datos entrantes.

  • nBufLen
    la longitud de lpBuf en bytes.

  • rSocketAddress
    Haga referencia a CString un objeto que recibe una dirección IP punteada number.

  • rSocketPort
    referencia a UINT que almacena un puerto.

  • lpSockAddr
    Un puntero a una estructura de SOCKADDR que contiene la dirección de origen a devuelto.

  • lpSockAddrLen
    un puntero a la longitud de la dirección de origen en lpSockAddr en bytes.

  • nFlags
    Especifica la manera en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro de nFlags . El último es construido combinando cualquiera de los valores siguientes con el operador de C++ OR :

    • MSG_PEEK Peek en los datos entrantes. Los datos se copia en el búfer pero no se quita de la cola de entrada.

    • Datos fuera de banda deMSG_OOB .

Valor devuelto

Si no se produce ningún error, ReceiveFrom devuelve el número de bytes recibidos. Si se ha cerrado la conexión, devuelve 0. Si no, un valor de SOCKET_ERROR se devuelve, y un código de error específico puede recuperar llamando a GetLastError. Los errores siguientes se aplican a esta función miembro:

  • WSANOTINITIALISED A AfxSocketInit correcto debe aparecer antes de utilizar esta API.

  • La implementación de Windows Sockets deWSAENETDOWN The detectó que produjo el subsistema de la red.

  • El argumento deWSAEFAULT The lpSockAddrLen no es: el búfer de lpSockAddr es demasiado pequeño para la dirección del mismo nivel.

  • La operación de Windows Sockets de bloqueo deWSAEINPROGRESS A está en curso.

  • El socket deWSAEINVAL no se ha enlazado con Enlazar.

  • El socket deWSAENOTCONN no está conectado (SOCK_STREAM solo).

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPP   MSG_OOB se especificó, pero el socket no es de SOCK_STREAMescrito.

  • Se cierra el socket deWSAESHUTDOWN The; no es posible llamar a ReceiveFrom en un socket después de que ShutDown invocarlo con nHow establecido en 0 o 2.

  • El socket deWSAEWOULDBLOCK The se marca como sin bloquear y la operación de ReceiveFrom bloquearía.

  • El datagrama deWSAEMSGSIZE The es demasiado grande caber en el búfer especificado y se ha truncado.

  • El circuito virtual deWSAECONNABORTED The era anulado debido al tiempo de espera u otro error.

  • El circuito virtual deWSAECONNRESET Se ha restablecido por el lado remoto.

Comentarios

Esta función se utiliza para leer datos entrantes en el socket de (conectada posiblemente) y para capturar la dirección desde la que los datos se envió.

Para controlar las direcciones de IPv6, utilice CAsyncSocket:: ReceiveFromEx.

Para los sockets de SOCK_STREAMcon tipo, se devuelve tanta información como está disponible actualmente hasta el tamaño del búfer proporcionado. Si el socket se ha configurado para la recepción entre líneas de datos fuera de banda (opción SO_OOBINLINEde socket) y los datos fuera de banda es no leídos, solo los datos fuera de banda se devolverán. La aplicación puede utilizar la opción o OnOutOfBandData de IOCtlSIOCATMARK de determinar si queda más datos fuera de banda leerse. Los parámetros de lpSockAddr y de lpSockAddrLen se omiten para sockets de SOCK_STREAM .

Para los sockets de datagrama, los datos se extraen del primer datagrama enviado a la cola, hasta el tamaño del búfer proporcionado. Si el datagrama es mayor que el búfer proporcionado, el búfer se rellena con la primera parte del mensaje, se pierde exceso de datos, y ReceiveFrom devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEMSGSIZE.

Si lpSockAddr es distinto de cero, y el socket es de SOCK_DGRAMescrito, copian la dirección de red de socket que envía los datos a la estructura correspondiente de SOCKADDR . El valor indicado por a lpSockAddrLen inicializa el tamaño de esta estructura, y se modifica de devolución para indicar el tamaño real de la dirección almacenada allí. Si no hay datos entrantes disponibles en el socket, la llamada de ReceiveFrom espera datos para llegar a menos que el socket no esté bloqueando. En este caso, un valor de SOCKET_ERROR se devuelve con el código de error establecido en WSAEWOULDBLOCK. La devolución de OnReceive se puede utilizar para determinar cuando es más datos.

Si el socket es de SOCK_STREAM escrito y el lado remoto ha cerrado la conexión correctamente, ReceiveFrom completará inmediatamente con los bytes 0 recibidos.

Requisitos

encabezado: afxsock.h

Vea también

Referencia

CAsyncSocket Class

Gráfico de jerarquías

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::Receive

CAsyncSocket::Send