Compartir a través de


Función WSARecvEx (mswsock.h)

La función WSARecvEx recibe datos de un socket conectado o de un socket sin conexión enlazado. La función WSARecvEx es similar a la función recv , salvo que el parámetro flags solo se usa para devolver información. Cuando se recibe un mensaje parcial mientras se usa el protocolo de datagramas, el bit de MSG_PARTIAL se establece en el parámetro flags que se devuelve de la función.

Nota La función WSARecvEx es una extensión específica de Microsoft para la especificación de Windows Sockets.
 

Sintaxis

int WSARecvEx(
  [in]      SOCKET s,
  [out]     char   *buf,
  [in]      int    len,
  [in, out] int    *flags
);

Parámetros

[in] s

Descriptor que identifica un socket conectado.

[out] buf

Puntero al búfer para recibir los datos entrantes.

[in] len

Longitud, en bytes, del búfer al que apunta el parámetro buf .

[in, out] flags

Indicador que especifica si el mensaje es totalmente o parcialmente recibido para los sockets de datagrama.

Valor devuelto

Si no se produce ningún error, WSARecvEx devuelve el número de bytes recibidos. Si se ha cerrado la conexión, devuelve cero. Además, si se recibió un mensaje parcial, el bit de MSG_PARTIAL se establece en el parámetro flags . Si se recibió un mensaje completo, MSG_PARTIAL no se establece en marcas.

De lo contrario, se devuelve un valor de SOCKET_ERROR y se puede recuperar un código de error específico mediante una llamada a WSAGetLastError.

Importante En el caso de un protocolo de transporte orientado a flujos, MSG_PARTIAL nunca se establece a cambio de WSARecvEx. Esta función se comporta de forma idéntica a la función recv para los protocolos de transporte de flujos.
 
Código de error Significado
WSAECONNABORTED
Se finalizó el circuito virtual debido a un tiempo de espera agotado u otro error. La aplicación debería cerrar el socket porque ya no se puede usar.
WSAECONNRESET
El lado remoto que ejecuta un cierre firme o de anulación restableció el circuito virtual. La aplicación debería cerrar el socket porque ya no se puede usar. En un socket de datagrama UPD, este error indicaría que una operación de envío anterior resultó en un mensaje ICMP de puerto inalcanzable.
WSAEFAULT
El parámetro buf no está completamente contenido en una parte válida del espacio de direcciones del usuario.
WSAEINPROGRESS
Una llamada de Bloqueo de Windows Sockets 1.1 está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAEINTR
La llamada WSACancelBlockingCall canceló la llamada (bloqueo).
WSAEINVAL
El socket no se ha enlazado con bind, o se especificó una marca desconocida, o MSG_OOB se especificó para un socket con SO_OOBINLINE habilitado o (solo para sockets de flujo de bytes) len era cero o negativo.
WSAENETDOWN
Error en el subsistema de red.
WSAENETRESET
En el caso de un socket orientado a la conexión, este error indica que la conexión se ha interrumpido debido a la actividad de mantenimiento activo que detectó un error mientras la operación estaba en curso. Para un socket de datagrama, este error indica que expiró el tiempo de vida.
WSAENOTCONN
El socket no está conectado.
WSAENOTSOCK
El descriptor no es un socket.
WSAEOPNOTSUPP
MSG_OOB se especificó, pero el socket no es de tipo SOCK_STREAM, los datos OOB no se admiten en el dominio de comunicación asociado a este socket o el socket es unidireccional y solo admite operaciones de envío.
WSAESHUTDOWN
El socket se ha apagado; no es posible usar WSARecvEx en un socket después de que se haya invocado el apagado con cómo se establece en SD_RECEIVE o SD_BOTH.
WSAETIMEDOUT
Se interrumpió la conexión debido a un error de red o porque el sistema del mismo nivel no respondió.
WSAEWOULDBLOCK
El socket se marca como no desbloqueado y la operación de recepción se bloquearía.
WSANOTINITIALISED
Debe producirse una llamada WSAStartup correcta antes de usar esta función.

Comentarios

La función WSARecvEx que forma parte de la implementación de Microsoft de Windows Sockets 2 es similar a la función de recv más común, excepto que el parámetro flags se usa para un único propósito específico. El parámetro flags se usa para indicar si se recibe un mensaje parcial o completo cuando se usa un protocolo orientado a mensajes.

El valor al que apunta el parámetro flags se omite en la entrada. Por lo tanto, no se puede pasar ninguna marca a la función WSARecvEx para modificar su comportamiento. El valor al que apunta el parámetro flags se establece en la salida. Esto difiere de las funciones recv y WSARecv en las que el valor al que apunta el parámetro flags en la entrada puede modificar el comportamiento de la función.

Las funciones WSARecvEx y recv se comportan de forma idéntica para los protocolos orientados a flujos.

El parámetro flags admite dos situaciones comunes en las que se recibirá un mensaje parcial:

  • Cuando el tamaño del búfer de datos de la aplicación es menor que el tamaño del mensaje y el mensaje llega coincidentemente en dos partes.
  • Cuando el mensaje es bastante grande y debe llegar en varias partes.
El bit de MSG_PARTIAL se establece en el valor al que apunta el parámetro flags en la devolución de WSARecvEx cuando se recibió un mensaje parcial. Si se recibió un mensaje completo, MSG_PARTIAL no se establece en el valor al que apunta el parámetro flags .

La función recv es diferente de la
Las funciones WSARecvEx y WSARecv en que la función recv siempre recibe un único mensaje para cada llamada para los protocolos de transporte orientados a mensajes. La función recv tampoco tiene un medio para indicar a la aplicación que los datos recibidos son solo un mensaje parcial. Una aplicación debe compilar su propio protocolo para comprobar si un mensaje es parcial o completo comprobando el código de error WSAEMSGSIZE después de cada llamada a recv. Cuando el búfer de la aplicación es menor que los datos que se envían, la mayor parte del mensaje que cabe se copia en el búfer del usuario y vuelve a devolverse con el código de error WSAEMSGSIZE. Una llamada posterior a recv obtendrá la siguiente parte del mensaje.

Las aplicaciones escritas para los protocolos de transporte orientados a mensajes deben codificarse para esta posibilidad si el tamaño del mensaje no está garantizado por el protocolo de transferencia de datos de la aplicación. Una aplicación puede usar recv y administrar el propio protocolo. Como alternativa, una aplicación puede usar WSARecvEx y comprobar que el bit de MSG_PARTIAL está establecido en el parámetro flags .

La función WSARecvEx proporciona al desarrollador una forma más eficaz de comprobar si un mensaje recibido es parcial o completo cuando llega un mensaje muy grande de forma incremental. Por ejemplo, si una aplicación envía un mensaje de un megabyte, el protocolo de transporte debe dividir el mensaje para enviarlo a través de la red física. Teóricamente es posible que el protocolo de transporte en el lado receptor almacene en búfer todos los datos del mensaje, pero esto sería bastante costoso en términos de recursos. En su lugar, se puede usar WSARecvEx , minimizar la sobrecarga y eliminar la necesidad de un protocolo basado en la aplicación.

Nota Todas las E/S iniciadas por un subproceso determinado se cancelan cuando se cierra ese subproceso. En el caso de los sockets superpuestos, las operaciones asincrónicas pendientes pueden producir un error si el subproceso está cerrado antes de que se completen las operaciones. Consulte la función ExitThread para obtener más información.
 

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado mswsock.h (incluya Mswsock.h)
Library Mswsock.lib
Archivo DLL Mswsock.dll

Consulte también

WSAAsyncSelect

WSARecv

Funciones winsock

Referencia de Winsock

recv

recvfrom

select

enviar

socket