Cómo pasar una conexión de socket entre subprocesos en una aplicación MFC en Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 175668 - Ver los productos a los que se aplica este artículo
Nota Microsoft Visual C++ .NET (2002) admite el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.
Expandir todo | Contraer todo

En esta página

Resumen

En este ejemplo se ilustra cómo pasar una conexión de socket entre subprocesos en una aplicación MFC. El ejemplo consta de dos proyectos, el servidor y el cliente. El servidor crea un nuevo subproceso para cada conexión para comunicarse con el cliente.

Más información

Servidor

El servidor ilustra mediante sockets en varios subprocesos en una aplicación MFC. El servidor escucha las conexiones. Cuando se solicita una nueva conexión, el servidor acepta la conexión y, a continuación, crea el subproceso para controlar la conexión. Cuando el servidor recibe un mensaje, invierte el mensaje y lo envía al cliente.

En MFC cuando tiene una conexión nueva es necesario aceptar la conexión en el subproceso que el socket de escucha se encuentra en. La llamada de Aceptar requiere que se pasa un objeto CAsyncSocket. MFC, a continuación, configura todo correctamente, de modo que la conexión puede ser un identificador en el subproceso. Si desea controlar esta conexión en un subproceso diferente, simplemente pasar el objeto MFC en el subproceso no funcionará correctamente. Para configurar correctamente todo para que la conexión tratarse de un subproceso diferente, los pasos siguientes son necesarios:

  1. Desasociar el identificador del objeto CAsyncSocket en el subproceso donde se aceptó la conexión del socket.
  2. Pasar el identificador del socket al subproceso.
  3. En el subproceso adjuntar este identificador a un objeto derivado de CAsyncSocket.
La llamada de asociar en el subproceso se configura todo correctamente las notificaciones de socket se envíen al subproceso que desea controlar la conexión.

El siguiente código desde el proyecto de servidor ilustra esto:

OnAccept para el socket de escucha.
   void CListensoc::OnAccept(int nErrorCode)
   {
      // New connection is being established

      CSocket soc;

      // Accept the connection using a temp CSocket object.
      Accept(soc);

      // Create a thread to handle the connection.
      // The thread is created suspended so that we can
      // set variables in CConnectThread before it starts executing.
      CConnectThread* pThread =
         (CConnectThread*)AfxBeginThread(
            RUNTIME_CLASS(CConnectThread),
            THREAD_PRIORITY_NORMAL,
            0,
            CREATE_SUSPENDED);
   ...
      // Pass the socket to the thread by passing the socket handle.
      // You cannot pass a CSocket object across threads.
      pThread->m_hSocket = soc.Detach();

      // Now start the thread.
      pThread->ResumeThread();

      CAsyncSocket::OnAccept(nErrorCode);
   }
				
InitInstance del subproceso.
   BOOL CConnectThread::InitInstance()
   {
   ...
      // Attach the socket handle to a CSocket object.
      // This makes sure that the socket notifications are sent
      // to this thread.
      m_socket.Attach(m_hSocket);
   ...
   }
				
el código anterior asegura que el socket está configurado correctamente en el subproceso secundario.

Cliente

El cliente acepta un nombre de host para conectarse a. Una vez realizada la conexión, el cliente le permite enviar mensajes al servidor. El cliente, a continuación, muestra el mensaje devuelto desde el servidor.

El servidor escucha en el puerto 9000. El cliente intenta conectarse a este puerto en el host especificado.

Los proyectos se crearon con Visual C++ versión 5.0. Sin embargo, el código en los ejemplos debe aplicar a las versiones de MFC mencionados anteriormente.

(c) 1997 Microsoft Corporation, reservados todos los derechos. Contribuciones por Sridhar S Madhugiri, Microsoft Corporation

Propiedades

Id. de artículo: 175668 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 7.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Subscription
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbinfo kbapi kbfile kbhowto kbnetwork kbsample kbthread kbuidesign kbwinsock KB175668 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 175668

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com