Udostępnij za pośrednictwem


Windows Sockets: Przykład Sockets przy użyciu archiwów

W tym artykule przedstawiono przykład użycia klasy CSocket.Przykład zatrudnia CArchive obiektów danych poprzez gniazdo serializować.Należy zauważyć, że nie jest serializacji dokumentu lub pliku.

Poniższy przykład ilustruje, jak używać archiwum do wysyłania i odbierania danych przez CSocket obiektów.Przykład zaprojektowano tak, aby dwa wystąpienia aplikacji (na tym samym komputerze lub na różnych komputerach w sieci) wymiany danych.Jedno wystąpienie wysyła dane, które inne wystąpienie odbiera i przyznaje.Aplikacja może zainicjować wymiany i albo może działać jako serwer lub klient do innej aplikacji.Następująca funkcja jest zdefiniowana w klasie widoku aplikacji:

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

Najważniejszą rzeczą w tym przykładzie jest to, że jego struktura równoleżnikami 10o MFC Serialize funkcji.PacketSerialize funkcji składowej składa się z Jeśli instrukcji z else klauzuli.Funkcja otrzymuje dwa CArchive odniesienia jako parametry: arData i arAck.Jeśli arData obiekt archiwum jest ustawiony do przechowywania (wysyłanie), Jeśli wykonuje oddział; inaczej, jeśli arData jest ustawiony dla ładowania (odbieranie) Funkcja przyjmuje else oddziału.Aby uzyskać więcej informacji na temat serializacji w MFC, zobacz serializacji.

[!UWAGA]

arAck Obiektu archiwum jest wartość równa przeciwieństwo arData.Jeśli arData jest do wysyłania, arAck otrzymuje, i jest to PRAWDA.

Do wysyłania, funkcja przykład pętli określoną liczbę razy, przy każdym generowania niektóre dane losowe dla celów demonstracyjnych.Aplikacja uzyskałby rzeczywiste dane z określonego źródła, takiego jak plik.arData 'S archiwum wstawiania operatora (<<) jest używany do wysyłania strumienia z trzech kolejnych fragmentów danych:

  • "Nagłówek", który określa charakter danych (w tym przypadku wartość bValue zmienna i liczbę kopii, które będą wysyłane).

    Oba elementy są losowo generowane w tym przykładzie.

  • Określona liczba kopii danych.

    Wewnętrzne dla pętli wysyła bValue określoną liczbę razy.

  • Ciąg o nazwie strText wyświetlający odbiornika do jego użytkownika.

Do odbierania, funkcja działa podobnie, z wyjątkiem, że używa operatora ekstrakcji archiwum (>>), aby pobrać dane z archiwum.Aplikacja odbierająca sprawdza dane go odbiera, wyświetla komunikat "Odebrane" końcowe i wysyła komunikat informujący, że "Wysłane" do aplikacji wysyłającej do wyświetlenia.

W tym modelu łączności, wyraz "Odebrane", wiadomość jest wysyłana w strText zmienna, jest wyświetlane na końcu komunikacji, więc Określa użytkownika otrzymującego otrzymano liczbę pakietów danych.Odbiornik odpowiedzi z podobnych ciąg, który mówi "Wysłane" do wyświetlania na ekranie oryginalnego nadawcy.Przyjęcie obu ciągów wskazuje wystąpił łączność.

Informacje dotyczące przestrogiPrzestroga

Podczas pisania program kliencki MFC do komunikacji z serwerami w ustalonych (non-MFC), nie należy wysyłać obiektów C++ w archiwum.Chyba, że serwer jest aplikacja MFC, który zrozumie rodzaje obiektów, które chcesz wysłać, nie będzie mógł odbierać i deserializacji obiekty.Przykład w artykule Windows Sockets: kolejność bajtów pokazuje komunikacja tego typu.

Aby uzyskać więcej informacji, zobacz Windows Sockets Specyfikacja: htonl, htons, ntohl, ntohs.Aby uzyskać więcej informacji, zobacz też:

Zobacz też

Informacje

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Koncepcje

Windows Sockets w MFC