CSocket
Klasa
Pochodzi z CAsyncSocket
klasy , dziedziczy hermetyzację interfejsu API Windows Sockets i reprezentuje wyższy poziom abstrakcji niż CAsyncSocket
ten obiektu.
Składnia
class CSocket : public CAsyncSocket
Elementy członkowskie
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
, , ReceiveFrom
Send
, SendTo
i 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łącz się z gniazdem klienta przy użyciu po Connect
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 CArchive
komunikacji zniszcz obiekty , CSocketFile
i CSocket
. Typ SOCKET
danych został opisany w artykule Windows Sockets: Background (Gniazda systemu Windows: tło).
W przypadku użycia z elementami CSocketFile
i CSocket
moż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 CSocketFile
CSocket
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_READ
elementu , 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
CSocket
Wymagania
Nagłówek: 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 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 obiektemCArchive
.Uwaga
Funkcja
Accept
składowa przyjmuje odwołanie do nowego, pustegoCSocket
obiektu jako parametru. Przed wywołaniemAccept
metody 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 hSocket
elementu .
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 OnMessagePending
moż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