Klasa CSocketFile
CFile
Obiekt używany do wysyłania i odbierania danych w sieci za pośrednictwem gniazd systemu Windows.
Składnia
class CSocketFile : public CFile
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CSocketFile::CSocketFile | CSocketFile Tworzy obiekt. |
Uwagi
W tym celu można dołączyć CSocketFile
obiekt do CSocket
obiektu. Można również, i zwykle, dołączyć CSocketFile
obiekt do CArchive
obiektu, aby uprościć wysyłanie i odbieranie danych przy użyciu serializacji MFC.
Aby serializować (wysyłać) dane, należy wstawić je do archiwum, co wywołuje CSocketFile
funkcje członkowskie, aby zapisywać dane w CSocket
obiekcie. Aby deserializować (odbierać) dane, wyodrębniasz je z archiwum. Powoduje to, że archiwum wywołuje CSocketFile
funkcje członkowskie w celu odczytywania danych z CSocket
obiektu.
Napiwek
Oprócz używania metody CSocketFile
zgodnie z CFile
opisem w tym miejscu można użyć go jako autonomicznego obiektu pliku, tak jak w przypadku klasy bazowej . Można również używać CSocketFile
z dowolnymi funkcjami serializacji MFC opartymi na archiwum. Ponieważ CSocketFile
nie obsługuje wszystkich CFile
funkcji, niektóre domyślne funkcje serializacji MFC nie są zgodne z CSocketFile
. Dotyczy to szczególnie CEditView
klasy . Nie należy próbować serializować CEditView
danych za pośrednictwem obiektu dołączonego CArchive
CSocketFile
do obiektu przy użyciu polecenia CEditView::SerializeRaw
; użyj CEditView::Serialize
zamiast tego. Funkcja SerializeRaw
oczekuje, że obiekt pliku ma funkcje, takie jak Seek
, które CSocketFile
nie mają.
W przypadku użycia z elementami CSocketFile
i CSocket
może wystąpić sytuacja, w której CSocket::Receive
wprowadza pętlę (przez PumpMessages(FD_READ)
) czekającą na żądaną CArchive
ilość bajtów. Dzieje się tak, ponieważ gniazda systemu Windows zezwalają tylko na jedno wywołanie recv na FD_READ powiadomienia, ale CSocketFile
CSocket
zezwalają na wiele wywołań recv na FD_READ. Jeśli otrzymasz FD_READ, gdy nie ma danych do odczytania, aplikacja zawiesza się. Jeśli nigdy nie otrzymasz innego FD_READ, aplikacja przestanie komunikować się za pośrednictwem gniazda.
Ten problem można rozwiązać w następujący sposób. OnReceive
W metodzie klasy gniazda wywołaj metodę CAsyncSocket::IOCtl(FIONREAD, ...)
przed wywołaniem Serialize
metody klasy komunikatów, gdy oczekiwane dane do odczytu z gniazda przekraczają rozmiar jednego pakietu TCP (maksymalna jednostka transmisji nośnika sieciowego, zwykle co najmniej 1096 bajtów). Jeśli rozmiar dostępnych danych jest mniejszy niż jest potrzebny, poczekaj na odebranie wszystkich danych, a następnie uruchom operację odczytu.
W poniższym przykładzie m_dwExpected
jest przybliżona liczba bajtów, które użytkownik spodziewa się otrzymać. Zakłada się, że deklarujesz go w innym miejscu w kodzie.
void CChatSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
DWORD dwReceived;
if (IOCtl(FIONREAD, &dwReceived))
{
if (dwReceived >= m_dwExpected) // Process only if you have enough data
m_pDoc->ProcessPendingRead();
}
else
{
// Error handling here
}
}
Aby uzyskać więcej informacji, zobacz Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives(Gniazda systemu Windows w MFC, Windows Sockets: Using Sockets with Archives, a także Windows Sockets 2 API).
Hierarchia dziedziczenia
CSocketFile
Wymagania
Nagłówek: afxsock.h
CSocketFile::CSocketFile
CSocketFile
Tworzy obiekt.
explicit CSocketFile(
CSocket* pSocket,
BOOL bArchiveCompatible = TRUE);
Parametry
pSocket
Gniazdo do dołączenia do CSocketFile
obiektu.
bArchiveCompatible
Określa, czy obiekt pliku ma być używany z obiektem CArchive
. Przekaż wartość FALSE tylko wtedy, gdy chcesz używać CSocketFile
obiektu w autonomiczny sposób, tak jak w przypadku obiektu autonomicznego CFile
, z pewnymi ograniczeniami. Ta flaga zmienia sposób, w jaki CArchive
obiekt dołączony do CSocketFile
obiektu zarządza buforem do odczytu.
Uwagi
Destruktor obiektu usuwa skojarzenie się z obiektu gniazda, gdy obiekt wykracza poza zakres lub jest usuwany.
Uwaga
Obiekt CSocketFile
może być również używany jako (ograniczony) plik bez CArchive
obiektu. Domyślnie CSocketFile
parametr bArchiveCompatible konstruktora ma wartość TRUE. Określa, że obiekt pliku jest używany z archiwum. Aby użyć obiektu pliku bez archiwum, przekaż wartość FALSE w parametrze bArchiveCompatible .
W trybie CSocketFile
"zgodnym z archiwum" obiekt zapewnia lepszą wydajność i zmniejsza niebezpieczeństwo "zakleszczenia". Zakleszczenie występuje, gdy zarówno gniazda wysyłające, jak i odbierające czekają na siebie nawzajem lub dla wspólnego zasobu. Taka sytuacja może wystąpić, jeśli CArchive
obiekt pracował ze CSocketFile
sposobem, w jaki działa z obiektem CFile
. W CFile
programie archiwum można założyć, że jeśli otrzyma mniej bajtów niż zażądano, osiągnięto koniec pliku.
Jednak dane CSocketFile
są oparte na komunikatach. Bufor może zawierać wiele komunikatów, więc odbieranie mniejszej liczby bajtów, których zażądano, nie oznacza zakończenia pliku. Aplikacja nie blokuje się w tym przypadku, ponieważ może CFile
mieć wartość , i może kontynuować odczytywanie komunikatów z buforu, dopóki bufor nie będzie pusty. Funkcja CArchive::IsBufferEmpty jest przydatna do monitorowania stanu buforu archiwum w takim przypadku.
Aby uzyskać więcej informacji na temat korzystania z CSocketFile
programu , zobacz artykuły Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets Using Archives (Używanie gniazd z archiwami i gniazd systemu Windows: przykład gniazd korzystających z archiwów).
Zobacz też
Klasa CFile
Wykres hierarchii
Klasa CAsyncSocket
Klasa CSocket