Klasa CSocketFileCSocketFile Class

CFileObiekt służący do wysyłania i otrzymywania danych przez sieć za pośrednictwem usługi Windows Sockets.A CFile object used for sending and receiving data across a network via Windows Sockets.

SkładniaSyntax

class CSocketFile : public CFile

Elementy członkowskieMembers

Konstruktory publicznePublic Constructors

NazwaName OpisDescription
CSocketFile::CSocketFileCSocketFile::CSocketFile Konstruuje CSocketFile obiekt.Constructs a CSocketFile object.

UwagiRemarks

W CSocketFile tym celu można dołączyć obiekt do CSocket obiektu.You can attach the CSocketFile object to a CSocket object for this purpose. Można również, i zwykle, dołączyć CSocketFile obiekt do CArchive obiektu, aby uprościć wysyłanie i otrzymywanie danych przy użyciu serializacji MFC.You also can, and usually do, attach the CSocketFile object to a CArchive object to simplify sending and receiving data using MFC serialization.

Aby serializować (wysłać) dane, należy wstawić je do archiwum, które wywołuje CSocketFile funkcje członkowskie do zapisu danych do CSocket obiektu.To serialize (send) data, you insert it into the archive, which calls CSocketFile member functions to write data to the CSocket object. Aby deserializować (odebrać) dane, Wyodrębnij z archiwum.To deserialize (receive) data, you extract from the archive. Powoduje to, że archiwum wywołuje CSocketFile funkcje członkowskie, aby odczytywać dane z CSocket obiektu.This causes the archive to call CSocketFile member functions to read data from the CSocket object.

Porada

Oprócz użycia CSocketFile zgodnie z opisem w tym miejscu można użyć go jako autonomicznego obiektu pliku, tak jak w przypadku CFile , jego klasy bazowej.Besides using CSocketFile as described here, you can use it as a stand-alone file object, just as you can with CFile, its base class. Można go również używać CSocketFile z wszystkimi funkcjami serializacji MFC opartymi na archiwum.You can also use CSocketFile with any archive-based MFC serialization functions. Ponieważ CSocketFile program nie obsługuje wszystkich CFile funkcji, niektóre domyślne funkcje serializacji MFC nie są zgodne z programem CSocketFile .Because CSocketFile does not support all of CFile's functionality, some default MFC serialize functions are not compatible with CSocketFile. Jest to szczególnie prawdziwe w CEditView klasie.This is particularly true of the CEditView class. Nie należy próbować serializować CEditView danych za pośrednictwem CArchive obiektu dołączonego do CSocketFile obiektu za pomocą CEditView::SerializeRaw ; CEditView::Serialize zamiast tego należy użyć.You should not try to serialize CEditView data through a CArchive object attached to a CSocketFile object using CEditView::SerializeRaw; use CEditView::Serialize instead. SerializeRawFunkcja oczekuje, że obiekt pliku ma funkcje, takie jak Seek , które CSocketFile nie ma.The SerializeRaw function expects the file object to have functions, such as Seek, that CSocketFile does not have.

W przypadku korzystania CArchive z programu z programem CSocketFile i CSocket można napotkać sytuację, w której CSocket::Receive wprowadzana jest pętla (przez PumpMessages(FD_READ) ), czekając na żądaną ilość bajtów.When you use CArchive with CSocketFile and CSocket, you might encounter a situation where CSocket::Receive enters a loop (by PumpMessages(FD_READ)) waiting for the requested amount of bytes. Wynika to z faktu, że usługa Windows Sockets zezwala tylko na jedno wywołanie odbierania na FD_READ powiadomienia, ale CSocketFile i CSocket zezwala na wiele wywołań odbierania na FD_READ.This is because Windows sockets allow only one recv call per FD_READ notification, but CSocketFile and CSocket allow multiple recv calls per FD_READ. Jeśli otrzymasz FD_READ, gdy nie ma danych do odczytania, aplikacja zawiesza się.If you get an FD_READ when there is no data to read, the application hangs. Jeśli nie otrzymasz kolejnej FD_READ, aplikacja przestanie komunikować się za pośrednictwem gniazda.If you never get another FD_READ, the application stops communicating over the socket.

Ten problem można rozwiązać w następujący sposób.You can resolve this problem as follows. W OnReceive metodzie klasy Socket Wywołaj CAsyncSocket::IOCtl(FIONREAD, ...) przed wywołaniem Serialize metody klasy wiadomości, gdy oczekiwane dane, które mają zostać odczytane z gniazda, przekraczają rozmiar jednego pakietu TCP (maksymalna jednostka transmisji nośnika sieciowego, zwykle co najmniej 1096 bajtów).In the OnReceive method of your socket class, call CAsyncSocket::IOCtl(FIONREAD, ...) before you call the Serialize method of your message class when the expected data to be read from the socket exceeds the size of one TCP packet (maximum transmission unit of the network medium, usually at least 1096 bytes). Jeśli rozmiar dostępnych danych jest mniejszy niż jest to konieczne, poczekaj na odebranie wszystkich danych, a następnie uruchom operację odczytu.If the size of the available data is less than needed, wait for all the data to be received and only then start the read operation.

W poniższym przykładzie m_dwExpected jest przybliżona liczba bajtów, które użytkownik oczekuje na otrzymanie.In the following example, m_dwExpected is the approximate number of bytes that the user expects to receive. Przyjęto założenie, że deklarujesz go w innym miejscu w kodzie.It is assumed that you declare it elsewhere in your code.

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: używanie gniazd z archiwami, a także interfejsu API Windows Sockets 2.For more information, see Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, as well as Windows Sockets 2 API.

Hierarchia dziedziczeniaInheritance Hierarchy

CObjectCObject

CFileCFile

CSocketFile

WymaganiaRequirements

Nagłówek: AfxSock. hHeader: afxsock.h

CSocketFile::CSocketFileCSocketFile::CSocketFile

Konstruuje CSocketFile obiekt.Constructs a CSocketFile object.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

ParametryParameters

pSocketpSocket
Gniazdo do dołączenia do CSocketFile obiektu.The socket to attach to the CSocketFile object.

bArchiveCompatiblebArchiveCompatible
Określa, czy obiekt pliku jest używany z CArchive obiektem.Specifies whether the file object is for use with a CArchive object. Należy przekazać wartość FALSE tylko wtedy, gdy obiekt ma być używany CSocketFile w sposób autonomiczny, jak w przypadku obiektu autonomicznego CFile z pewnymi ograniczeniami.Pass FALSE only if you want to use the CSocketFile object in a stand-alone manner as you would a stand-alone CFile object, with certain limitations. Ta flaga zmienia sposób, w jaki CArchive obiekt dołączony do CSocketFile obiektu zarządza jego buforem do odczytu.This flag changes how the CArchive object attached to the CSocketFile object manages its buffer for reading.

UwagiRemarks

Destruktor obiektu odkojarzy się z obiektem gniazda, gdy obiekt wykracza poza zakres lub został usunięty.The object's destructor disassociates itself from the socket object when the object goes out of scope or is deleted.

Uwaga

CSocketFileMożna również użyć jako pliku (z ograniczeniami) bez CArchive obiektu.A CSocketFile can also be used as a (limited) file without a CArchive object. Domyślnie CSocketFile parametr bArchiveCompatible konstruktora ma wartość true.By default, the CSocketFile constructor's bArchiveCompatible parameter is TRUE. Określa, że obiekt pliku jest używany z archiwum.This specifies that the file object is for use with an archive. Aby użyć obiektu pliku bez archiwum, w parametrze bArchiveCompatible należy przekazać wartość false.To use the file object without an archive, pass FALSE in the bArchiveCompatible parameter.

W trybie "zgodne z archiwum" CSocketFile obiekt zapewnia lepszą wydajność i zmniejsza zagrożenie "zakleszczenie".In its "archive compatible" mode, a CSocketFile object provides better performance and reduces the danger of a "deadlock." Zakleszczenie występuje, gdy zarówno gniazdo wysyłające, jak i przejmujące czekają na siebie lub dla typowego zasobu.A deadlock occurs when both the sending and receiving sockets are waiting on each other, or for a common resource. Taka sytuacja może wystąpić, jeśli CArchive obiekt działał w sposób, w CSocketFile jaki działa, z CFile obiektem.This situation might occur if the CArchive object worked with the CSocketFile the way it does with a CFile object. W programie CFile archiwum może założyć, że jeśli odbierze mniejszą liczbę bajtów niż zażądano, osiągnięto koniec pliku.With CFile, the archive can assume that if it receives fewer bytes than it requested, the end of file has been reached.

CSocketFileDane są jednak oparte na komunikatach; bufor może zawierać wiele komunikatów, więc otrzymanie mniejszej liczby bajtów nie oznacza końca pliku.With CSocketFile, however, data is message based; the buffer can contain multiple messages, so receiving fewer than the number of bytes requested does not imply end of file. Aplikacja nie jest blokowana w tym przypadku, ponieważ może w tym przypadku CFile , i może kontynuować odczytywanie komunikatów z bufora do momentu, gdy bufor jest pusty.The application does not block in this case as it might with CFile, and it can continue reading messages from the buffer until the buffer is empty. Funkcja CArchive:: IsBufferEmpty jest przydatna do monitorowania stanu buforu Archiwum w takich przypadkach.The CArchive::IsBufferEmpty function is useful for monitoring the state of the archive's buffer in such a case.

Aby uzyskać więcej informacji o używaniu programu CSocketFile , zobacz artykuł Windows Sockets: używanie gniazd z archiwami i Windows Sockets: przykład gniazd korzystających z archiwów.For more information on the use of CSocketFile, see the articles Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets Using Archives.

Zobacz teżSee also

Klasa CFileCFile Class
Wykres hierarchiiHierarchy Chart
Klasa CAsyncSocketCAsyncSocket Class
Klasa CSocketCSocket Class