E/S superpuesta y objetos de eventos

Windows Sockets 2 admite E/S superpuesta y todos los proveedores de transporte admiten esta funcionalidad. La E/S superpuesta sigue el modelo establecido en Windows y se puede realizar en sockets creados con la función de socket o sockets creados con la función WSASocket con la marca WSA_FLAG_OVERLAPPED establecida en el parámetro dwFlags .

Nota

La creación de un socket con el atributo superpuesto no afecta a si un socket está actualmente en modo de bloqueo o no de bloqueo. Los sockets creados con el atributo superpuesto se pueden usar para realizar E/S superpuestas, lo que no cambia el modo de bloqueo de un socket. Dado que las operaciones de E/S superpuestas no se bloquean, el modo de bloqueo de un socket es irrelevante para estas operaciones.

 

Para recibir, las aplicaciones usan las funciones WSARecv o WSARecvFrom para proporcionar búferes en los que se van a recibir los datos. Si uno o varios búferes se publican antes de la hora en que la red ha recibido los datos, esos datos podrían colocarse en los búferes del usuario inmediatamente a medida que llega. Por lo tanto, puede evitar la operación de copia que, de lo contrario, se produciría en el momento en que se invoca la función recv o recvfrom. Si los datos ya están presentes cuando se publican búferes de recepción, se copian inmediatamente en los búferes del usuario.

Si los datos llegan cuando la aplicación no ha publicado búferes de recepción, la red recurre al conocido estilo sincrónico de operación. Es decir, los datos entrantes se almacena en búfer internamente hasta que la aplicación emite una llamada de recepción y, por tanto, proporciona un búfer en el que se pueden copiar los datos. Una excepción a esto es cuando la aplicación usa setsockopt para establecer el tamaño del búfer de recepción en cero. En este caso, los protocolos confiables solo permitirían recibir datos cuando se hubieran publicado búferes de aplicaciones y se perderían datos en protocolos no confiables.

En el lado de envío, las aplicaciones usan WSASend o WSASendTo para proporcionar punteros a búferes rellenados y, a continuación, aceptan no molestar los búferes de ninguna manera hasta que la red haya consumido el contenido del búfer.

Las llamadas de envío y recepción superpuestas se devuelven inmediatamente. Un valor devuelto de cero indica que la operación de E/S se completó inmediatamente y que ya se produjo la indicación de finalización correspondiente. Es decir, se ha señalado el objeto de evento asociado o se ha puesto en cola una rutina de finalización y se ejecutará cuando el subproceso de llamada entre en el estado de espera de alerta.

Un valor devuelto de SOCKET_ERROR junto con un código de error de WSA_IO_PENDING indica que la operación superpuesta se ha iniciado correctamente y que se proporcionará una indicación posterior cuando se consuman búferes de envío o cuando se haya completado una operación de recepción. Sin embargo, en el caso de los sockets con estilo de secuencia de bytes, la indicación de finalización se produce cada vez que se agotan los datos entrantes, independientemente de si los búferes están llenos. Cualquier otro código de error indica que la operación superpuesta no se inició correctamente y que no habrá ninguna indicación de finalización próxima.

Las operaciones de envío y recepción se pueden superponer. Las funciones de recepción se pueden invocar varias veces para publicar búferes de recepción como preparación para los datos entrantes, y las funciones de envío se pueden invocar varias veces para poner en cola varios búferes para enviar. Aunque la aplicación puede depender de una serie de búferes de envío superpuestos que se envían en el orden proporcionado, las indicaciones de finalización correspondientes pueden producirse en un orden diferente. Del mismo modo, en el lado receptor, los búferes se pueden rellenar en el orden en que se suministran, pero las indicaciones de finalización pueden producirse en un orden diferente.

En muchos casos, las operaciones superpuestas de Winsock mediante AcceptEx, ConnectEx, WSASend, WSARecv, TransmitFile y funciones similares son cancelables. Sin embargo, el comportamiento no está definido para el uso continuado de un socket que ha cancelado las operaciones pendientes. Se debe llamar a la función closesocket después de cancelar una operación superpuesta. Por lo tanto, para obtener los mejores resultados, en lugar de cancelar la E/S directamente, se debe llamar a la función closesocket para cerrar el socket que finalmente interrumpirá todas las operaciones pendientes.

La característica de finalización diferida de E/S superpuesta también está disponible para WSAIoctl, que es una versión mejorada de ioctlsocket.