Udostępnij za pośrednictwem


Klasa CSocket

Wynika z CAsyncSocket, dziedziczy jej hermetyzację interfejsu API Windows Sockets i reprezentuje wyższy poziom abstrakcji, niż w przypadku CAsyncSocket obiektu.

class CSocket : public CAsyncSocket

Członkowie

wxzt95kb.collapse_all(pl-pl,VS.110).gifPubliczne konstruktory

Nazwa

Opis

CSocket::CSocket

Konstrukcje CSocket obiektu.

wxzt95kb.collapse_all(pl-pl,VS.110).gifMetody publiczne

Nazwa

Opis

CSocket::Attach

Dołącza GNIAZDO uchwyt, aby CSocket obiektu.

CSocket::CancelBlockingCall

Anuluje wywołanie blokowania, który jest obecnie w toku.

CSocket::Create

Tworzy gniazda.

CSocket::FromHandle

Zwraca wskaźnik do CSocket obiektu, biorąc pod uwagę GNIAZDO obsługi.

CSocket::IsBlocking

Określa, czy blokowanie połączeń jest w toku.

wxzt95kb.collapse_all(pl-pl,VS.110).gifMetody chronione

Nazwa

Opis

CSocket::OnMessagePending

O nazwie proces oczekujące wiadomości podczas oczekiwania na wywołanie blokowania zakończyć.

Uwagi

CSocketwspółpracuje z klasy CSocketFile i CArchive do zarządzania wysyłania i odbierania danych.

A CSocket obiektu również umożliwia blokowanie, co jest niezbędne do pracy synchronicznej z CArchive.Blocking functions, such as Receive, Send, ReceiveFrom, SendTo, and Accept (all inherited from CAsyncSocket), do not return a WSAEWOULDBLOCK error in CSocket.Zamiast tego te funkcje czekać, aż do zakończenia operacji.Dodatkowo, oryginalny rozmowa zostanie zakończona z powodu błędu WSAEINTR Jeśli CancelBlockingCall nazywa się podczas jednej z tych funkcji jest blokowanie.

Aby użyć CSocket obiektu, wywołanie konstruktora, następnie wywołać Create do tworzenia podstawowych SOCKET obsługi (typ SOCKET).Parametry domyślne Create utworzyć gniazda strumienia, ale jeśli nie używasz gniazda z CArchive obiektu, można określić parametr zamiast tego utworzyć gniazdo datagramu lub bind do określonego portu utworzyć gniazda serwera.Podłączyć do gniazda klienta za pomocą Connect po stronie klienta i Accept po stronie serwera.Następnie utwórz CSocketFile obiektu i skojarzyć go do CSocket obiekt w CSocketFile Konstruktor.Następnie należy utworzyć CArchive obiekt do wysyłania i jeden do odbierania danych (w razie potrzeby), a następnie skojarzyć je z CSocketFile obiekt w CArchive Konstruktor.Po zakończeniu łączności, zniszczyć CArchive, CSocketFile, i CSocket obiektów.SOCKET Typ danych jest opisany w artykule Windows Sockets: tło.

Podczas korzystania z CArchive z CSocketFile i CSocket, może wystąpić sytuacja, gdy CSocket::Receive wchodzi w pętlę (przez PumpMessages(FD_READ)) czeka na żądana ilość bajtów.To jest, ponieważ Windows sockets zezwala na tylko jedno wywołanie recv za powiadomienie FD_READ, ale CSocketFile i CSocket Zezwalaj na wiele wywołań recv na FD_READ.Jeśli masz FD_READ, gdy nie ma żadnych danych do odczytu, aplikacja zawiesza się.Jeśli nie masz w innym FD_READ, aplikacja przestanie działać, komunikować się za pośrednictwem gniazda.

Ten problem można rozwiązać następująco.W OnReceive klasy socket, wywołanie metody CAsyncSocket::IOCtl(FIONREAD, ...) przed wywołaniem Serialize metoda klasy wiadomości, gdy oczekiwane dane odczytywane z gniazda przekracza rozmiar jeden pakiet TCP (maksymalna jednostka transmisji z nośnika sieci, zwykle co najmniej 1096 bajtów).Jeśli rozmiar danych jest mniejsza niż jest to potrzebne, czekać na wszystkie dane, aby być odebrane i dopiero wtedy uruchomić operacji odczytu.

W poniższym przykładzie m_dwExpected jest przybliżoną liczbę bajtów, które użytkownik spodziewa się otrzymywać.Zakłada się, że należy zadeklarować to 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
   }
}

[!UWAGA]

Podczas korzystania z gniazda MFC w dodatkowych wątków w aplikacji MFC statycznie, trzeba wywołać AfxSocketInit w każdym wątku, który używa gniazda zainicjować biblioteki gniazd.Domyślnie AfxSocketInit jest wywoływana tylko w wątku głównego.

Aby uzyskać więcej informacji, zobacz Windows Sockets MFC, Windows Sockets: za pomocą gniazd z archiwum, Windows Sockets: jak gniazda z archiwów pracy, Windows Sockets: Sekwencja operacji, Windows Sockets: przykład z gniazda za pomocą archiwum.

Hierarchia dziedziczenia

CObject

CAsyncSocket

CSocket

Wymagania

Nagłówek: afxsock.h

Zobacz też

Informacje

Klasa CAsyncSocket

Wykres hierarchii

Klasa CAsyncSocket

Klasa CSocketFile