CSocket Klasa

Pochodzi z CAsyncSocketklasy , dziedziczy hermetyzację interfejsu API Windows Sockets i reprezentuje wyższy poziom abstrakcji niż CAsyncSocket ten obiektu.

Składnia

class CSocket : public CAsyncSocket

Członkowie

Konstruktory publiczne

Nazwa/nazwisko opis
CSocket::CSocket CSocket Tworzy obiekt.

Metody publiczne

Nazwa/nazwisko opis
CSocket::Attach SOCKET Dołącza uchwyt do CSocket obiektu.
CSocket::CancelBlockingCall Anuluje połączenie blokujące, które jest obecnie w toku.
CSocket::Create Tworzy gniazdo.
CSocket::FromHandle Zwraca wskaźnik do CSocket obiektu, biorąc pod SOCKET uwagę uchwyt.
CSocket::IsBlocking Określa, czy trwa wywołanie blokujące.

Metody chronione

Nazwa/nazwisko opis
CSocket::OnMessagePending Wywoływana w celu przetwarzania oczekujących komunikatów podczas oczekiwania na zakończenie wywołania blokującego.

Uwagi

CSocket współpracuje z klasami CSocketFile i CArchive zarządza wysyłaniem i odbieraniem danych.

Obiekt CSocket zapewnia również blokowanie, co jest niezbędne do synchronicznej operacji .CArchive Funkcje blokujące, takie jak Receive, , ReceiveFromSend, SendToi Accept (wszystkie dziedziczone z CAsyncSocket), nie zwracają WSAEWOULDBLOCK błędu w pliku CSocket. Zamiast tego te funkcje czekają na zakończenie operacji. Ponadto oryginalne wywołanie zakończy się błędem WSAEINTR, jeśli CancelBlockingCall jest wywoływane, gdy jedna z tych funkcji blokuje.

Aby użyć CSocket obiektu, wywołaj konstruktor, a następnie wywołaj metodę Create , aby utworzyć dojście bazowe SOCKET (typ SOCKET). Domyślne parametry Create tworzenia gniazda strumienia, ale jeśli nie używasz gniazda z obiektem CArchive , możesz określić parametr do utworzenia gniazda datagramu lub powiązać z określonym portem w celu utworzenia gniazda serwera. Połączenie do gniazda klienta przy użyciu Connect po stronie klienta i Accept po stronie serwera. Następnie utwórz CSocketFile obiekt i skojarz go z CSocket obiektem w konstruktorze CSocketFile . Następnie utwórz CArchive obiekt do wysyłania i jeden do odbierania danych (zgodnie z potrzebami), a następnie skojarz je z CSocketFile obiektem w konstruktorze CArchive . Po zakończeniu CArchivekomunikacji zniszcz obiekty , CSocketFilei CSocket . Typ SOCKET danych został opisany w artykule Windows Sockets: Background (Gniazda systemu Windows: tło).

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 powiadomienie, ale CSocketFileCSocket zezwalają na wiele wywołań recv na FD_READ. Jeśli otrzymasz błąd FD_READ , gdy nie ma danych do odczytania, aplikacja zawiesza się. Jeśli nigdy nie otrzymasz innego FD_READelementu , aplikacja przestanie komunikować się przez gniazdo.

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
   }
}

Uwaga

W przypadku korzystania z gniazd MFC w wątkach pomocniczych w statycznie połączonej aplikacji MFC należy wywołać AfxSocketInit w każdym wątku, który używa gniazd do inicjowania bibliotek gniazd. Domyślnie AfxSocketInit jest wywoływana tylko w wątku podstawowym.

Aby uzyskać więcej informacji, zobacz Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives( Gniazda systemu Windows: How Sockets with Archives Work, Windows Sockets: Sequence of Operations, Windows Sockets: Example of Sockets Using Archives: Example of Sockets Using Archives: Example of Sockets Using Archives( Jak działają gniazda z archiwami), Windows Sockets: Sequence of Operations ( Sekwencja operacji, Windows Sockets: Example of Sockets Using Archives).

Hierarchia dziedziczenia

CObject

CAsyncSocket

CSocket

Wymagania

Nagłówka:afxsock.h

CSocket::Attach

Wywołaj tę funkcję składową, aby dołączyć hSocket uchwyt do CSocket obiektu.

BOOL Attach(SOCKET hSocket);

Parametry

hSocket
Zawiera uchwyt do gniazda.

Wartość zwracana

Nonzero, jeśli funkcja zakończy się pomyślnie.

Uwagi

Uchwyt SOCKET jest przechowywany w elemencie danych obiektu m_hSocket .

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

Przykład

class CSockThread : public CWinThread
{
public:
   SOCKET m_hConnected;

protected:
   CChatSocket m_sConnected;

   // remainder of class declaration omitted.

 

BOOL CSockThread::InitInstance()
{
   // Attach the socket object to the socket handle
   // in the context of this thread.
   m_sConnected.Attach(m_hConnected);
   m_hConnected = NULL;

   return TRUE;
}

 

// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
   UNREFERENCED_PARAMETER(nErrorCode);

   // This CSocket object is used just temporarily
   // to accept the incoming connection.
   CSocket sConnected;
   Accept(sConnected);

   // Start the other thread.
   CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
       RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
   if (NULL != pSockThread)
   {
      // Detach the newly accepted socket and save
      // the SOCKET handle in our new thread object.
      // After detaching it, it should no longer be
      // used in the context of this thread.
      pSockThread->m_hConnected = sConnected.Detach();
      pSockThread->ResumeThread();
   }
}

CSocket::CancelBlockingCall

Wywołaj tę funkcję składową, aby anulować obecnie trwające wywołanie blokujące.

void CancelBlockingCall();

Uwagi

Ta funkcja anuluje wszelkie zaległe operacje blokujące dla tego gniazda. Oryginalne wywołanie blokujące zostanie zakończone tak szybko, jak to możliwe z powodu błędu WSAEINTR.

W przypadku operacji blokowania Connect implementacja gniazd systemu Windows zakończy wywołanie blokujące tak szybko, jak to możliwe, ale może nie być możliwe, aby zasoby gniazda zostały zwolnione do momentu zakończenia połączenia (a następnie zresetowania) lub przekroczenia limitu czasu. Może to być zauważalne tylko wtedy, gdy aplikacja natychmiast próbuje otworzyć nowe gniazdo (jeśli nie są dostępne gniazda) lub połączyć się z tym samym elementem równorzędnym.

Anulowanie dowolnej operacji innej niż Accept może pozostawić gniazdo w nieokreślonym stanie. Jeśli aplikacja anuluje operację blokującą na gniazdach, jedyną operacją, którą aplikacja może zależeć od możliwości wykonania na gniazdie, jest wywołanie metody Close, chociaż inne operacje mogą działać na niektórych implementacjach gniazd systemu Windows. Jeśli potrzebujesz maksymalnej możliwości przenoszenia aplikacji, należy zachować ostrożność, aby nie zależeć od wykonywania operacji po anulowaniu.

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

CSocket::Create

Wywołaj funkcję składową po utworzeniu Create obiektu gniazda, aby utworzyć gniazdo systemu Windows i dołączyć go.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    LPCTSTR lpszSocketAddress = NULL);

Parametry

nSocketPort
Określony port do użycia z gniazdem lub 0, jeśli chcesz, aby MFC wybrać port.

nSocketType
Usługa SOCK_STREAM lub SOCK_DGRAM.

lpszSocketAddress
Wskaźnik do ciągu zawierającego adres sieciowy połączonego gniazda, numer kropkowany, taki jak "128.56.22.8". Przekazanie ciągu NULL dla tego parametru wskazuje CSocket , że wystąpienie powinno nasłuchiwać aktywności klienta we wszystkich interfejsach sieciowych.

Wartość zwracana

Nonzero, jeśli funkcja zakończyła się pomyślnie; w przeciwnym razie 0 i można pobrać określony kod błędu przez wywołanie metody GetLastError.

Uwagi

Create następnie wywołuje metodę Bind powiązania gniazda z określonym adresem. Obsługiwane są następujące typy gniazd:

  • SOCK_STREAM Zapewnia sekwencjonowane, niezawodne, dwukierunkowe strumienie bajtów oparte na połączeniach. Używa protokołu TCP (Transmission Control Protocol) dla rodziny adresów internetowych.

  • SOCK_DGRAM Obsługuje datagramy, które są bez połączenia, zawodne bufory stałej (zwykle małej) maksymalnej długości. Używa protokołu UDP (User Datagram Protocol) dla rodziny adresów internetowych. Aby użyć tej opcji, nie można użyć gniazda z obiektem CArchive .

    Uwaga

    Funkcja Accept składowa przyjmuje odwołanie do nowego, pustego CSocket obiektu jako parametru. Przed wywołaniem Acceptmetody należy skonstruować ten obiekt . Należy pamiętać, że jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte. Nie należy wywoływać Create tego nowego obiektu gniazda.

Aby uzyskać więcej informacji na temat gniazd strumienia i datagramu, zobacz artykuły Windows Sockets: Background, Windows Sockets: Ports and Sockets i Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: Porty i gniazda gniazd systemu Windows: używanie gniazd z archiwami).

CSocket::CSocket

CSocket Tworzy obiekt.

CSocket();

Uwagi

Po zakończeniu budowy należy wywołać funkcję składową Create .

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

CSocket::FromHandle

Zwraca wskaźnik do CSocket obiektu.

static CSocket* PASCAL FromHandle(SOCKET hSocket);

Parametry

hSocket
Zawiera uchwyt do gniazda.

Wartość zwracana

Wskaźnik do CSocket obiektu lub NULL jeśli nie CSocket ma obiektu dołączonego do hSocketelementu .

Uwagi

Jeśli dany SOCKET uchwyt, jeśli CSocket obiekt nie jest dołączony do uchwytu, funkcja składowa zwraca NULL i nie tworzy obiektu tymczasowego.

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

CSocket::IsBlocking

Wywołaj tę funkcję składową, aby określić, czy trwa wywołanie blokujące.

BOOL IsBlocking();

Wartość zwracana

Nonzero, jeśli gniazdo blokuje; w przeciwnym razie 0.

Uwagi

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

CSocket::OnMessagePending

Zastąpi tę funkcję składową, aby wyszukać określone komunikaty z systemu Windows i odpowiedzieć na nie w gniazdach.

virtual BOOL OnMessagePending();

Wartość zwracana

Nonzero, jeśli komunikat został obsłużony; w przeciwnym razie 0.

Uwagi

Jest to zaawansowane przesłonięcia.

Wywołania OnMessagePending struktury, gdy gniazdo pompuje komunikaty systemu Windows, aby umożliwić sobie radzenie sobie z interesującymi cię komunikatami aplikacji. Przykłady użycia programu OnMessagePendingmożna znaleźć w artykule Windows Sockets: Wyprowadzanie z klas gniazd.

Aby uzyskać więcej informacji, zobacz Windows Sockets: Using Sockets with Archives (Gniazda systemu Windows: używanie gniazd z archiwami).

Zobacz też

CAsyncSocket Klasa
Wykres hierarchii
CAsyncSocket Klasa
CSocketFile Klasa