Condividi tramite


Windows Sockets: Esempio di socket utilizzando gli archivi

In questo articolo viene riportato un esempio di classe CSocketutilizzando.L'esempio utilizza oggetti di CArchive per serializzare i dati mediante un socket.Si noti che non si tratta di serializzazione del documento o a un file.

Nell'esempio seguente viene illustrato come utilizzare l'archivio per inviare e ricevere i dati tra gli oggetti di CSocket .Progettare l'esempio in modo da due istanze di trasferimento di dati dell'applicazione sullo stesso computer o in diversi computer nella rete).Un'istanza invia i dati, che l'altra istanza riceve e riconosciuto.Qualsiasi applicazione possibile avviare uno scambio e spostandosi può essere utilizzato come server o come client all'altra applicazione.La seguente funzione è definita nella classe di visualizzazione dell'applicazione:

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();
      }
    }
}

La maggior parte degli elementi importante su questo esempio è che i relativi paralleli della struttura di un MFC Serialize eseguire.La funzione membro di PacketSerialize è costituita da un'istruzione di if con una clausola di else .La funzione riceve due riferimenti di CArchive come parametri: arData e arAck.Se l'oggetto dell'archivio di arData è impostato per archiviare (inviare), il ramo di if esegue; in caso contrario, se arData è impostato per il caricamento (ricevere) la funzione accetta il ramo di else .Per ulteriori informazioni sulla serializzazione in MFC, vedere serializzazione.

[!NOTA]

L'oggetto dell'archivio di arAck sia l'opposto di arData.Se arData è per inviare, arAck riceve e contrario è true.

Per inviare, la funzione di esempio viene eseguito un ciclo per un determinato numero di volte, ogni volta generando dati casuali a scopo dimostrativo.L'applicazione otterrà dati reali in un'origine, ad esempio un file.L'operatore di inserimento dell'archivio di arData (<<) viene utilizzato per inviare un flusso di tre blocchi consecutivi di dati:

  • “Intestazione„ che specifica la tipologia dei dati (in questo caso, il valore della variabile di bValue e il numero di copie verranno inviate).

    Entrambi gli elementi vengono generati casualmente per questo esempio.

  • Il numero specificato delle copie dei dati.

    Il ciclo interno di for invia bValue il numero di volte specificato.

  • Una stringa ha chiamato strText visualizzato dal ricevitore all'utente.

Per ricevere, la funzione viene eseguita nello stesso modo, con la differenza che utilizza l'operatore di estrazione dell'archivio (>>) per ottenere i dati dall'archivio.L'applicazione di ricezione verifica i dati che riceve, verrà visualizzato il messaggio “ha„ finale e quindi restituisce un messaggio che indica “inviato„ per l'applicazione di invio visualizzare.

In questo modello di comunicazione, la parola “ha ricevuto„, il messaggio inviato nella variabile di strText , è per la visualizzazione all'altra estremità di comunicazione, pertanto specifica all'utente di ricezione che un determinato numero di pacchetti di dati sono stati ricevuti.Il ricevitore risponde a una stringa simile che indica “inviato„, per visualizzazione sullo schermo originale del mittente.La ricezione di entrambe le stringhe indica che la riuscita comunicazione si è verificata.

Nota di avvisoAttenzione

Se si scrive un MFC il programma client per comunicare con i server consolidato (non MFC), non inviare oggetti C++ nell'archivio.A meno che il server sia un'applicazione MFC che individua i tipi di oggetti si desidera inviare, non sarà possibile ricevere e deserializzare gli oggetti.Un esempio nell'articolo Windows Sockets: ordinamento di byte illustrata una comunicazione di questo tipo.

Per ulteriori informazioni, vedere la specifica di Windows Sockets: htonl, htons, ntohl, ntohs.Inoltre, per ulteriori informazioni, vedere:

Vedere anche

Riferimenti

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Concetti

In Windows Sockets MFC