Windows Sockets: BloqueoWindows Sockets: Blocking

En este artículo y dos artículos complementarios se explican varios problemas en la programación de Windows Sockets.This article and two companion articles explain several issues in Windows Sockets programming. En este artículo se trata el bloqueo.This article covers blocking. Los demás problemas se describen en los artículos: Windows Sockets: orden de bytes y Windows Sockets: convertir cadenas.The other issues are covered in the articles: Windows Sockets: Byte Ordering and Windows Sockets: Converting Strings.

Si usa o deriva de la clase CAsyncSocket, tendrá que administrar estos problemas por sí mismo.If you use or derive from class CAsyncSocket, you will need to manage these issues yourself. Si usa o deriva de la clase CSocket, MFC los administra automáticamente.If you use or derive from class CSocket, MFC manages them for you.

BloqueosBlocking

Un socket puede estar en "modo de bloqueo" o "modo de no bloqueo".A socket can be in "blocking mode" or "nonblocking mode." Las funciones de sockets en modo de bloqueo (o sincrónico) no devuelven hasta que pueden completar su acción.The functions of sockets in blocking (or synchronous) mode do not return until they can complete their action. Esto se denomina bloqueo porque el socket cuya función se llamó no puede hacer nada (se bloquea) hasta que se devuelve la llamada.This is called blocking because the socket whose function was called cannot do anything — is blocked — until the call returns. Una llamada a la Receive función miembro, por ejemplo, puede tardar un tiempo arbitrariamente largo para completarse mientras espera a que se envíe la aplicación de envío (es decir, si usa CSocket o CAsyncSocket con bloqueo).A call to the Receive member function, for example, might take an arbitrarily long time to complete as it waits for the sending application to send (this is if you are using CSocket, or using CAsyncSocket with blocking). Si un CAsyncSocket objeto está en modo de no bloqueo (funciona de forma asincrónica), la llamada se devuelve inmediatamente y el código de error actual, recuperable con la función miembro GetLastError , es WSAEWOULDBLOCK, lo que indica que la llamada habría bloqueado si no se devolviera inmediatamente debido al modo.If a CAsyncSocket object is in nonblocking mode (operating asynchronously), the call returns immediately and the current error code, retrievable with the GetLastError member function, is WSAEWOULDBLOCK, indicating that the call would have blocked had it not returned immediately because of the mode. ( CSocket nunca devuelve WSAEWOULDBLOCK.(CSocket never returns WSAEWOULDBLOCK. La clase administra el bloqueo automáticamente).The class manages blocking for you.)

El comportamiento de los sockets es diferente en los sistemas operativos de 32 y 64 bits (como Windows 95 o Windows 98) que en los sistemas operativos de 16 bits (como Windows 3,1).The behavior of sockets is different under 32-bit and 64-bit operating systems (such as Windows 95 or Windows 98) than under 16-bit operating systems (such as Windows 3.1). A diferencia de los sistemas operativos de 16 bits, los sistemas operativos de 32 bits y 64 bits usan la multitarea preferente y proporcionan multithreading.Unlike 16-bit operating systems, the 32-bit and 64-bit operating systems use preemptive multitasking and provide multithreading. En los sistemas operativos de 32 bits y 64 bits, puede colocar los sockets en subprocesos de trabajo independientes.Under the 32-bit and 64-bit operating systems, you can put your sockets in separate worker threads. Un socket en un subproceso puede bloquearse sin interferir con otras actividades de la aplicación y sin dedicar tiempo de proceso al bloqueo.A socket in a thread can block without interfering with other activities in your application and without spending compute time on the blocking. Para obtener información sobre la programación multiproceso, vea el artículo multithreading.For information on multithreaded programming, see the article Multithreading.

Nota

En las aplicaciones multiproceso, puede usar la naturaleza de bloqueo de CSocket para simplificar el diseño del programa sin afectar a la capacidad de respuesta de la interfaz de usuario.In multithreaded applications, you can use the blocking nature of CSocket to simplify your program's design without affecting the responsiveness of the user interface. Mediante el control de las interacciones de usuario en el subproceso principal y el CSocket procesamiento de subprocesos alternativos, puede separar estas operaciones lógicas.By handling user interactions in the main thread and CSocket processing in alternate threads, you can separate these logical operations. En una aplicación que no es multiproceso, estas dos actividades se deben combinar y administrar como un solo subproceso, lo que normalmente significa usar CAsyncSocket para que pueda controlar las solicitudes de comunicaciones a petición o reemplazar CSocket::OnMessagePending para controlar las acciones del usuario durante la actividad sincrónica prolongada.In an application that is not multithreaded, these two activities must be combined and handled as a single thread, which usually means using CAsyncSocket so you can handle communications requests on demand, or overriding CSocket::OnMessagePending to handle user actions during lengthy synchronous activity.

El resto de este debate es para los programadores destinados a sistemas operativos de 16 bits:The rest of this discussion is for programmers targeting 16-bit operating systems:

Normalmente, si usa CAsyncSocket , debe evitar el uso de operaciones de bloqueo y operar de forma asincrónica en su lugar.Normally, if you are using CAsyncSocket, you should avoid using blocking operations and operate asynchronously instead. En operaciones asincrónicas, desde el punto en el que se recibe un código de error WSAEWOULDBLOCK después de llamar a Receive , por ejemplo, se espera OnReceive a que se llame a la función miembro para que se le notifique que puede volver a leer.In asynchronous operations, from the point at which you receive a WSAEWOULDBLOCK error code after calling Receive, for example, you wait until your OnReceive member function is called to notify you that you can read again. Las llamadas asincrónicas se realizan mediante una llamada a la función de notificación de devolución de llamada adecuada del socket, como alreceive.Asynchronous calls are made by calling back your socket's appropriate callback notification function, such as OnReceive.

En Windows, las llamadas de bloqueo se consideran prácticas incorrectas.Under Windows, blocking calls are considered bad practice. De forma predeterminada, CAsyncSocket admite llamadas asincrónicas y debe administrar el bloqueo usted mismo mediante notificaciones de devolución de llamada.By default, CAsyncSocket supports asynchronous calls, and you must manage the blocking yourself using callback notifications. La clase CSocket, por otro lado, es sincrónica.Class CSocket, on the other hand, is synchronous. Bombea mensajes de Windows y administra el bloqueo.It pumps Windows messages and manages blocking for you.

Para obtener más información sobre el bloqueo, consulte la especificación de Windows Sockets.For more information about blocking, see the Windows Sockets specification. Para obtener más información sobre las funciones "ON", vea Windows Sockets: notificaciones de socket y Windows Sockets: derivar de clases de socket.For more information about "On" functions, see Windows Sockets: Socket Notifications and Windows Sockets: Deriving from Socket Classes.

Para más información, consulte:For more information, see:

Consulta tambiénSee also

Windows Sockets en MFCWindows Sockets in MFC
CAsyncSocket:: alenviarCAsyncSocket::OnSend