Udostępnij za pośrednictwem


Klasa CSocketFile

A CFile obiekt używany do wysyłania i odbierania danych przez sieć za pośrednictwem usługi Windows Sockets.

class CSocketFile : public CFile

Członkowie

1e4zc0sx.collapse_all(pl-pl,VS.110).gifPubliczne konstruktory

Nazwa

Opis

CSocketFile::CSocketFile

Konstrukcje CSocketFile obiektu.

Uwagi

Można dołączyć CSocketFile obiektu do CSocket obiektu w tym celu.Można również i zazwyczaj dołączyć CSocketFile obiektu do CArchive obiekt, aby uprościć wysyłanie i odbieranie danych za pomocą serializacji MFC.

Serializować danych (send), wstawisz go do archiwum, który wywołuje CSocketFile funkcji elementów członkowskich do zapisu danych do CSocket obiektu.Do deserializacji (odbierania) danych, ekstrakt z archiwum.Powoduje to archiwum do wywołania CSocketFile funkcji elementów członkowskich do odczytu danych z CSocket obiektu.

PoradaPorada

Oprócz funkcji CSocketFile opisane w tym miejscu, można go jako obiekt autonomiczny plik tak samo, jak z CFile, jej klasa podstawowa.Można również użyć CSocketFile wszelkie funkcje oparte na archiwum serializacji MFC.Ponieważ CSocketFile nie obsługuje wszystkich CFile's serializować funkcjonalność niektóre domyślne MFC funkcje nie są zgodne z CSocketFile.Jest to szczególnie istotne w CEditView klasy.Nie należy próbować serializować CEditView danych poprzez CArchive dołączony obiekt CSocketFile obiektu za pomocą CEditView::SerializeRaw; Użyj CEditView::Serialize zamiast.SerializeRaw Obiektu pliku, aby funkcje, takie jak funkcja spodziewa się Seek, że CSocketFile nie ma.

Podczas korzystania CArchive z CSocketFile i CSocket, mogą wystąpić w sytuacji gdy CSocket::Receive wchodzi w pętlę (przez PumpMessages(FD_READ)) oczekiwanie na żądana ilość bajtów.Jest to, ponieważ Windows sockets zezwala tylko jedno wywołanie recv na powiadomienie FD_READ, ale CSocketFile i CSocket Zezwalaj na wiele wywołań recv na FD_READ.Jeśli otrzymasz FD_READ, gdy nie ma danych do odczytu, zawiesza się stosowanie.Jeżeli nigdy nie FD_READ innego, aplikacja przestaje komunikuje w gnieździe.

Ten problem można rozwiązać następująco.W OnReceive klasy socket, wywołanie metody CAsyncSocket::IOCtl (FIONREAD,...) przed wywołaniem Serialize metody klasy wiadomości, gdy oczekiwane dane odczytywane z gniazda przekracza rozmiar jeden pakiet TCP (maksymalna jednostka transmisji nośnika sieci, zwykle co najmniej 1096 bajtów).Jeśli rozmiar danych dostępnych jest mniej niż potrzebne, oczekiwanie na danych być odbierane i następnie rozpoczęcie operacji odczytu.

W poniższym przykładzie m_dwExpected przybliżoną liczbę bajtów, które użytkownik spodziewa się otrzymywać.Zakłada się, że możesz to zgłosić gdzie indziej 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 w MFC, Windows Sockets: za pomocą gniazd z archiwami, jak również Interfejsu API programu Windows Sockets 2.

Hierarchii dziedziczenia

CObject

CFile

CSocketFile

Wymagania

Nagłówek: afxsock.h

Zobacz też

Informacje

Klasa CFile

Wykres hierarchii

Klasa CAsyncSocket

Klasa CSocket