Windows Sockets: Jak działają Sockets z archiwów
W tym artykule wyjaśniono, jak CSocket obiektu, CSocketFile obiektu i CArchive obiektu są łączone uproszczenie wysyłanie i odbieranie danych za pośrednictwem gniazd systemu Windows.
Artykuł Windows Sockets: przykład z Sockets przy użyciu archiwum przedstawia PacketSerialize funkcji.Obiekt archiwum w PacketSerialize przykład działa bardzo podobnie obiektu archiwum przekazany do biblioteki MFC Serialize funkcji.Podstawową różnicą jest, aby dla gniazd, archiwum jest dołączony nie normą CFile obiektu (zazwyczaj skojarzony z pliku dyskowego) ale do CSocketFile obiektu.Zamiast łączenia pliku na dysku, CSocketFile obiekt, który łączy się z CSocket obiektu.
A CArchive buforu zarządza obiekt.Gdy bufor przechowywania archiwum (wysyłanie) jest pełny, skojarzonego CFile obiekt zapisuje się zawartość bufora.Opróżnianie buforu archiwum podłączony do gniazda jest równoważne do wysyłania wiadomości.Po zapełnieniu bufor archiwum załadunku (odbieranie) CFile obiektu zatrzymuje odczytu, dopóki bufor jest ponownie dostępne.
Klasy CSocketFile wynika z CFile, ale nie obsługuje CFile funkcji elementów członkowskich, takie jak funkcje pozycjonowania (Seek, GetLength, SetLengthi tak dalej), funkcji blokowania (LockRange, UnlockRange), lub GetPosition funkcji.Wszystkie CSocketFile wykonać obiektu jest zapisu lub odczytu sekwencji bajtów z skojarzonym lub CSocket obiektu.Ponieważ plik nie jest zaangażowany, operacje takie jak Seek i GetPosition nie ma sensu.CSocketFilepochodzi z CFile, więc zwykle będzie dziedziczyć wszystkie te funkcje składowe.Aby temu zapobiec, nieobsługiwane CFile funkcji elementów członkowskich są zastępowane w CSocketFile rzucał CNotSupportedException.
CSocketFile Członkowskich wywołuje obiekt, funkcje jej CSocket obiekt do wysyłania lub odbierania danych.
Na poniższym rysunku pokazano relacje między te obiekty po obu stronach komunikatu.
CArchive, CSocketFile i CSocket
Celem tego stopnia skomplikowania jest użytkownik osłony z konieczności zarządzania szczegóły gniazda samodzielnie.Utworzyć gniazda i plik archiwum, a następnie rozpocząć wysyłającego lub odbierającego dane od wstawienia go do archiwum lub wyodrębnienie jej z archiwum.CArchive, CSocketFile, i CSocket zarządzanie szczegóły w tle.
A CSocket obiektu jest aktualnie obiektem dwóch państw: czasami asynchronicznych (stan zwykły) i czasami synchronicznych.W stanie asynchronicznego gniazda można odbierać asynchroniczne powiadomienia z RAM.Jednak podczas operacji takich jak odbieranie lub wysyłanie danych synchroniczne będzie gniazdo.Oznacza to, że gniazdo otrzymają żadnych dalszych asynchroniczne powiadomienia, dopóki synchronicznych operacji.Ponieważ przełączenie trybów, można na przykład, czy zbliżoną do następującej:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
Jeśli CSocket nie zostały zaimplementowane jako obiekt dwóch Państw może być odbierać powiadomienia dodatkowe dla tego samego rodzaju zdarzeń podczas były przetwarzania wcześniejszego powiadomienia.Na przykład, można uzyskać OnReceive powiadomienia podczas przetwarzania OnReceive.W powyższym fragmencie kodu wyodrębnianie str z archiwum może prowadzić do rekursji.Przełączając Państwa, CSocket zapobiega rekursji poprzez zapobieganie dodatkowe powiadomienia.Ogólną zasadą jest żadne powiadomienia w ramach powiadomienia.
[!UWAGA]
A CSocketFile można również jako plik (ograniczony) bez CArchive obiektu.Domyślnie CSocketFile konstruktora bArchiveCompatible jest parametr TRUE.To określa, że obiekt pliku do użytku z archiwum.Aby użyć obiektu pliku bez archiwum, przekazać FALSE w bArchiveCompatible parametru.
W trybie "zgodny z archiwum" CSocketFile obiektu zapewnia lepszą wydajność i zmniejsza niebezpieczeństwo "zakleszczenia." Zakleszczenie występuje, gdy sockets wysyłające i odbierające są oczekujące na siebie lub oczekiwania na wspólnych zasobów.Taka sytuacja może wystąpić, jeśli CArchive obiektu pracował z CSocketFile sposób, nie z CFile obiektu.Z CFile, archiwum można zakładać, że jeżeli otrzyma mniejszej liczby bajtów niż wnioskuje koniec pliku osiągnięto.Z CSocketFile, jednak dane jest wiadomość; bufor może zawierać wiele wiadomości, dzięki otrzymujących mniejsza niż żądana liczba bajtów oznacza koniec pliku.Aplikacja nie blokuje w tym przypadku, na przykład z CFile, i można kontynuować odczytu wiadomości z buforu, dopóki bufor jest pusty.IsBufferEmpty działać w CArchive jest przydatny do monitorowania stanu buforu archiwum w takim przypadku.
Aby uzyskać więcej informacji, zobacz Windows Sockets: za pomocą gniazd z archiwum