Udostępnij za pośrednictwem


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 CFileopisem 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 CFilefunkcji, 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 CSocketmoż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

Obiekt CObject

CFile

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 CFileprogramie archiwum można założyć, że jeśli otrzyma mniej bajtów niż zażądano, osiągnięto koniec pliku.

Jednak dane CSocketFilesą 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 CFilemieć 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 CSocketFileprogramu , 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