Se recomienda usar Visual Studio 2017

Windows Sockets: Ejemplo de Sockets que usan archivos

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Este artículo muestra un ejemplo de la clase mediante CSocket. El ejemplo emplea los objetos de CArchive para serializar datos mediante un socket. Observe que no es serialización de documentos a o desde un archivo.

El ejemplo siguiente se muestra cómo utilizar el archivo para enviar y recibir datos a través de los objetos de CSocket . Diseñar el ejemplo para dos instancias de intercambiar los datos de la aplicación (en el mismo equipo o en equipos diferentes en la red). Una instancia envía los datos, que la otra instancia recibe y confirma. Cualquier aplicación puede iniciar un intercambio, y cualquiera puede actuar como un servidor o como cliente a otra aplicación. La siguiente función se define en la clase de vista de la aplicación:

void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
   BYTE bValue = 0;
   WORD nCopies = 0;

    if (arData.IsStoring())
    {
        CString strText;
        errno_t err;
        unsigned int number;

        for(int p = 0; p < nPackets; p++)
        {
            err = rand_s(&number);
            // if (err == 0)...
            bValue = (BYTE)(number%256);

            err = rand_s(&number);
            // if (err == 0)...
            nCopies = (WORD)(number%32000);

            // Send header information
            arData << bValue << nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Send data
                arData << bValue;
            }

            strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
            p + 1, nPackets, (int)bValue, nCopies);

            // Send receipt string
            arData << strText;
            arData.Flush();

            // Receive acknowledgment
            arAck >> strText;
            // display it
            DisplayMessage(strText);
        }
    }
    else
    {
        CString strText;
        BYTE bCheck;

        for(int p = 0; p < nPackets; p++)
        {
            // Receive header information
            arData >> bCheck >> nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Receive data
                arData >> bValue;
                if (bCheck != bValue)
            {
               AfxMessageBox(_T("Packet Failure"));
            }
         }

         // Receive receipt string and display it
         arData >> strText;
         DisplayMessage(strText);

         strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"), 
            p + 1, nPackets, (int)bValue, nCopies);

         // Send acknowledgment
         arAck << strText;
         arAck.Flush();
      }
    }
}

Lo más importante sobre este ejemplo es que sus paralelos de estructura que MFC Serialize funcione. La función miembro de PacketSerialize consiste en una instrucción de if con una cláusula de else . La función recibe dos referencias de CArchive como parámetros: arData y arAck. Si el objeto del archivo de arData se establece para almacenar (transporte), la bifurcación de if se ejecuta; si no, si arData se establece para la carga (receptora) la función toma la bifurcación de else . Para obtener más información sobre la serialización en MFC, vea Serialización.

System_CAPS_ICON_note.jpg Nota

El objeto del archivo de arAck se asume que el cambio de arData. Si arData es para enviar, arAck recibe, y el inverso es true.

Para enviar, bucles de la función de ejemplo para un número especificado de veces, generar cada vez algunos datos aleatorios demostración. La aplicación obtendría datos reales de algún origen, como un archivo. Se utiliza el operador de inserción del archivo de arData (<<) para enviar una secuencia de tres partes consecutivos de datos:

  • Un “encabezado” que especifica la naturaleza de los datos (en este caso, el valor de la variable de bValue y cuántos copias se enviarán).

    Ambos elementos se generan de forma aleatoria para este ejemplo.

  • El número especificado de copias de los datos.

    El bucle interno de para envía bValue el número especificado de veces.

  • Una cadena denominada strText que el receptor muestra al usuario.

Para recibir, la función funciona de forma similar, pero utiliza el operador de extracción de archivo (>>) para recopilar datos de archivo. La aplicación receptora comprueba los datos que recibe, muestra el mensaje “recibido” end, y después devuelven a un mensaje que indica “Sent” para que la aplicación de envío muestra.

En este las comunicaciones de, la palabra “recibida”, el mensaje enviado en la variable de strText , son para la presentación en el otro extremo de la comunicación, por lo que especifica el usuario que recibe que algunos paquetes de datos se han recibido. El receptor responde con una cadena similar que indica “Sent”, para la presentación en la pantalla del remitente original. La recepción de ambas cadenas indica que la comunicación correcta ha producido.

System_CAPS_ICON_caution.jpg Precaución

Si está escribiendo un programa cliente de MFC para comunicarse con los servidores establecidos (de no MFC), no envíe los objetos de C++ a través del archivo. A menos que el servidor es una aplicación MFC que entienda las clases de objetos desee enviar, no podrá recibir y deserializar objetos. Un ejemplo en el caso Windows Sockets: El orden de byte muestra una comunicación de este tipo.

Para obtener más información, vea la especificación de Windows Sockets: htonl, htons, ntohl, ntohs. Además, para obtener más información, vea:

Windows Sockets en MFC
CArchive::IsStoring
CArchive::operator <<
CArchive::operator >>
CArchive::Flush
CObject::Serialize

Mostrar: