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ść.
Przestroga |
---|
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ż: