Windows Sockets: jak działają gniazda z archiwami
W tym artykule wyjaśniono, jak CSocketFile, CSocket obiektu, klasy obiektu i CArchive obiektu są łączone, aby uprościć wysyłanie i odbieranie danych poprzez gniazdo systemu Windows.
Artykuł Windows Sockets: przykład z gniazda za pomocą archiwum przedstawia PacketSerialize funkcji.Obiekt archiwum w PacketSerialize przykład działa podobnie jak obiekt archiwum przekazany do biblioteki MFC Serialize funkcji.Zasadnicza różnica jest, aby dla gniazd, archiwum dołączono nie zgodnie z normą CFile obiektu (zwykle związane z pliku na dysku) ale do CSocketFile obiektu.Zamiast nawiązywanie połączeń z pliku na dysku, CSocketFile obiektu łączy się CSocket obiektu.
A CArchive buforu zarządza obiekt.Kiedy bufor przechowywania archiwum (wysyłanie) jest pełna, skojarzony CFile obiekt zapisuje się zawartość buforu.Opróżnianie buforu archiwum podłączony do gniazda jest odpowiednikiem wysyłanie wiadomości.Po zapełnieniu buforu archiwum załadunku (odbieranie), CFile obiektu Zatrzymuje czytanie, dopóki bufor jest ponownie dostępny.
Klasa CSocketFile wywodzi się z CFile, ale nie obsługuje CFile funkcji elementów członkowskich takich jak funkcje pozycjonowania (Seek, GetLength, SetLength, i tak dalej), funkcji blokowania (LockRange, UnlockRange), lub GetPosition funkcji.Wszystkie klasy obiektu należy wykonać jest zapisu lub odczytu sekwencje bajtów z związanych z nimi 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 funkcje składowe są zastępowane w CSocketFile rzucić CNotSupportedException.
CSocketFile Obiektu wywołuje Członkowskich funkcje z jej CSocket obiekt do wysyłania lub odbierania danych.
Na poniższej ilustracji pokazano relacje między te obiekty po obu stronach komunikatu.
CArchive, klasy i CSocketFile, CSocket
Celem tego stopnia skomplikowania jest tarcza możesz z konieczności zarządzania szczegółowe informacje o gnieździe samodzielnie.Tworzenie gniazda, plik i archiwum, a następnie zacznij od wysyłającego lub otrzymującego dane wstawienia go do archiwum lub wydobycia go z archiwum.CArchive, klasy, i CSocketFile, CSocket Zarządzanie szczegółami w tle.
A CSocket obiektu jest aktualnie obiektem dwóch państw: czasami asynchronicznego (zwykle Państwo) i czasami synchronicznych.W stanie asynchronicznego gniazda można odbierać asynchroniczne powiadomienia z ramach.Jednak podczas takiej operacji jak odbieranie lub wysyłanie danych gniazdo staje się synchronicznych.Oznacza to, że gniazdo otrzymają żadnych dalszych asynchroniczne powiadomienia zakończenia operacji synchronicznych.Ponieważ przełącza tryby, można na przykład, można wykonać mniej więcej następująco:
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ć można otrzymać dodatkowe powiadomienia dla tego samego rodzaju zdarzeń podczas wcześniejszego powiadomienia zostały przetwarzania.Na przykład, można uzyskać OnReceive powiadomienia podczas przetwarzania OnReceive.W powyższym fragmencie kodu wyodrębnianie str z archiwum może doprowadzić do rekursji.Przełączając Państwa, CSocket zapobiega rekursji poprzez zapobieganie dodatkowe powiadomienia.Ogólną zasadą jest nie powiadomienia w terminie powiadomienia.
[!UWAGA]
A CSocketFile może również służyć jako plik (ograniczone) bez CArchive obiektu.Domyślnie CSocketFile konstruktora bArchiveCompatible jest parametr TRUE.Określa, że obiekt pliku jest do użytku z archiwum.Aby użyć obiektu pliku bez archiwum, należy przekazać FALSE w bArchiveCompatible parametru.
W trybie "zgodne z archiwum" CSocketFile obiektu zapewnia lepszą wydajność i zmniejsza niebezpieczeństwo "zakleszczenie." Zakleszczenie występuje, gdy wysyłające i odbierające sockets są oczekiwanie na siebie lub oczekiwania na wspólnych zasobów.Taka sytuacja może wystąpić, jeśli CArchive obiektu pracował z CSocketFile sposób, w jaki z CFile obiektu.Z CFile, archiwum można założyć, że jeśli odbierze mniejszej liczby bajtów, niż jest to wymagane, na końcu pliku została osiągnięta.Z CSocketFile, jednak dane są wiadomości na podstawie; bufor może zawierać wiele wiadomości, więc odbierania mniejsza niż żądana liczba bajtów oznacza koniec pliku.Aplikacja nie blokuje w tym przypadku, na przykład z CFile, i może kontynuować odczytywanie wiadomości z bufora, dopóki bufor jest pusty.IsBufferEmpty funkcjonować w CArchive jest przydatny do monitorowania stanu buforu archiwum w takim przypadku.
Aby uzyskać więcej informacji, zobacz Windows Sockets: przy użyciu gniazd z archiwum