Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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, , 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łą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 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 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_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
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_STREAMZapewnia sekwencjonowane, niezawodne, dwukierunkowe strumienie bajtów oparte na połączeniach. Używa protokołu TCP (Transmission Control Protocol) dla rodziny adresów internetowych.SOCK_DGRAMObsł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
Acceptskładowa przyjmuje odwołanie do nowego, pustegoCSocketobiektu jako parametru. Przed wywołaniemAcceptmetody 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ćCreatetego 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