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