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
Publiczne konstruktory
Nazwa |
Opis |
---|---|
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.
Porada |
---|
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
CSocketFile
Wymagania
Nagłówek: afxsock.h