Udostępnij za pośrednictwem


Windows Sockets: przykład gniazd korzystających z archiwów

W tym artykule przedstawia przykład użycia klasy CSocketFile, CSocket.Przykład zatrudnia CArchive obiektów do serializacji danych za pośrednictwem gniazda.Należy zauważyć, że nie jest to dokument serializacji do lub z pliku.

Poniższy przykład ilustruje, jak używać archiwum do wysyłania i odbierania danych przez CSocket obiektów.Przykład zaprojektowano tak, że dwa wystąpienia aplikacji (na tym samym komputerze lub na różnych komputerach w sieci) wymiany danych.Jedno wystąpienie wysyła danych, co inne wystąpienie odbiera i przyjmuje do wiadomości.Aplikacja może inicjować wymianę 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, że jego struktura równoleżnikami MFC Serialize funkcji.PacketSerialize funkcji składowej składa się z czy instrukcja z innego klauzuli.Funkcja otrzymuje dwa CArchive odwołania jako parametry: arData i arAck.Jeśli arData obiekt archiwum jest ustawiony do przechowywania (wysyłanie), czy wykonuje oddział; inaczej, jeśli arData jest ustawiony dla ładowania (odbieranie) Funkcja przyjmuje innego oddziału.Aby uzyskać więcej informacji na temat serializacji MFC, zobacz serializacji.

[!UWAGA]

arAck Obiektu archiwum zakłada się przeciwieństwem arData.Jeśli arData jest do wysyłania, arAck otrzymuje, i jest to PRAWDA.

Do wysyłania, przykład funkcja pętle określoną liczbę razy, każdorazowo generowania niektóre dane losowe w celach demonstracyjnych.Aplikacja by uzyskać prawdziwe dane z określonego źródła, takiego jak plik.arData Archiwum operatora wstawiania (<<) jest używany do wysyłania strumienia trzy kolejne fragmenty danych:

  • "Nagłówek", która określa rodzaj danych (w tym przypadku wartość bValue zmiennej i liczbę kopii zostanie wysłany).

    Zarówno elementy są losowo generowane na przykład.

  • Określony numer kopii danych.

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

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

Do odbioru, funkcja działa podobnie, z tym wyjątkiem, że używa operatora ekstrakcji archiwum (>>), aby pobrać dane z archiwum.Aplikacja odbierająca weryfikuje dane go odbiera, wyświetla komunikat "Otrzymano" ostateczne i następnie wysyła ponownie komunikat, że "Wysłane" dla aplikacji wysyłającej do wyświetlenia.

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

Informacje dotyczące przestrogiPrzestroga

Podczas pisania programu MFC klienta do komunikacji z serwerami ustalonych (non-MFC), nie należy wysyłać za pośrednictwem archiwum z obiektami C++.Chyba że serwer aplikacji MFC, który zrozumie rodzaje obiektów, które chcesz wysłać, nie będzie mogą odbierać i deserializacji obiektów.Przykład w artykule Windows Sockets: bajtów to pokazuje komunikat tego typu.

Aby uzyskać więcej informacji, zobacz Specyfikacja systemu Windows Sockets: 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