Udostępnij za pośrednictwem


CAsyncSocket Klasa

Reprezentuje gniazdo systemu Windows — punkt końcowy komunikacji sieciowej.

Składnia

class CAsyncSocket : public CObject

Elementy członkowskie

Konstruktory publiczne

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

Metody publiczne

Nazwa/nazwisko opis
CAsyncSocket::Accept Akceptuje połączenie w gniazdie.
CAsyncSocket::AsyncSelect Żąda powiadomienia o zdarzeniu dla gniazda.
CAsyncSocket::Attach Dołącza uchwyt gniazda do CAsyncSocket obiektu.
CAsyncSocket::Bind Kojarzy adres lokalny z gniazdem.
CAsyncSocket::Close Zamyka gniazdo.
CAsyncSocket::Connect Ustanawia połączenie z gniazdem równorzędnym.
CAsyncSocket::Create Tworzy gniazdo.
CAsyncSocket::CreateEx Tworzy gniazdo z opcjami zaawansowanymi.
CAsyncSocket::Detach Odłącza uchwyt gniazda od CAsyncSocket obiektu.
CAsyncSocket::FromHandle Zwraca wskaźnik do CAsyncSocket obiektu, biorąc pod uwagę uchwyt gniazda.
CAsyncSocket::GetLastError Pobiera stan błędu ostatniej operacji, która zakończyła się niepowodzeniem.
CAsyncSocket::GetPeerName Pobiera adres gniazda równorzędnego, z którym jest podłączone gniazdo.
CAsyncSocket::GetPeerNameEx Pobiera adres gniazda równorzędnego, z którym jest podłączone gniazdo (obsługuje adresy IPv6).
CAsyncSocket::GetSockName Pobiera nazwę lokalną gniazda.
CAsyncSocket::GetSockNameEx Pobiera nazwę lokalną gniazda (obsługuje adresy IPv6).
CAsyncSocket::GetSockOpt Pobiera opcję gniazda.
CAsyncSocket::IOCtl Steruje trybem gniazda.
CAsyncSocket::Listen Ustanawia gniazdo do nasłuchiwania przychodzących żądań połączeń.
CAsyncSocket::Receive Odbiera dane z gniazda.
CAsyncSocket::ReceiveFrom Odbiera datagram i przechowuje adres źródłowy.
CAsyncSocket::ReceiveFromEx Odbiera datagram i przechowuje adres źródłowy (obsługuje adresy IPv6).
CAsyncSocket::Send Wysyła dane do połączonego gniazda.
CAsyncSocket::SendTo Wysyła dane do określonego miejsca docelowego.
CAsyncSocket::SendToEx Wysyła dane do określonego miejsca docelowego (obsługuje adresy IPv6).
CAsyncSocket::SetSockOpt Ustawia opcję gniazda.
CAsyncSocket::ShutDown Send Wyłącza i/lub Receive wywołuje gniazdo.
CASyncSocket::Socket Przydziela uchwyt gniazda.

Metody chronione

Nazwa/nazwisko opis
CAsyncSocket::OnAccept Powiadamia gniazdo nasłuchiwania, że może zaakceptować oczekujące żądania połączenia, wywołując polecenie Accept.
CAsyncSocket::OnClose Powiadamia gniazdo, że gniazdo podłączone do niego zostało zamknięte.
CAsyncSocket::OnConnect Powiadamia gniazdo łączące, że próba połączenia została ukończona, niezależnie od tego, czy zakończyła się pomyślnie, czy w błędzie.
CAsyncSocket::OnOutOfBandData Powiadamia gniazdo odbierające, że na gniazdach mają być odczytywane dane poza pasmem, zwykle pilny komunikat.
CAsyncSocket::OnReceive Powiadamia gniazdo nasłuchiwania, że istnieją dane do pobrania przez wywołanie metody Receive.
CAsyncSocket::OnSend Powiadamia gniazdo, że może wysyłać dane, wywołując polecenie Send.

Operatory publiczne

Nazwa/nazwisko opis
CAsyncSocket::operator = Przypisuje nową wartość do CAsyncSocket obiektu.
CAsyncSocket::operator SOCKET Użyj tego operatora, aby pobrać SOCKET uchwyt CAsyncSocket obiektu.

Publiczne elementy członkowskie danych

Nazwa/nazwisko opis
CAsyncSocket::m_hSocket SOCKET Wskazuje uchwyt dołączony do tego CAsyncSocket obiektu.

Uwagi

Klasa CAsyncSocket hermetyzuje interfejs API usługi Windows Socket Functions, zapewniając abstrakcję zorientowaną obiektowo dla programistów, którzy chcą używać gniazd systemu Windows w połączeniu z MFC.

Ta klasa jest oparta na założeniu, że rozumiesz komunikację sieciową. Odpowiadasz za obsługę blokowania, różnic w kolejności bajtów i konwersji między ciągami unicode i zestawem znaków wielobajtowych (MBCS). Jeśli potrzebujesz wygodniejszego interfejsu, który zarządza tymi problemami, zobacz klasę CSocket.

Aby użyć CAsyncSocket obiektu, wywołaj jego konstruktor, a następnie wywołaj Create funkcję w celu utworzenia bazowego uchwytu gniazda (typu SOCKET), z wyjątkiem akceptowanych gniazd. W przypadku gniazda serwera wywołaj Listen funkcję składową, a w przypadku gniazda klienta wywołaj funkcję składową Connect . Gniazdo serwera powinno wywołać Accept funkcję po otrzymaniu żądania połączenia. Użyj pozostałych CAsyncSocket funkcji, aby przeprowadzać komunikację między gniazdami. Po zakończeniu CAsyncSocket zniszcz obiekt, jeśli został utworzony na stercie; destruktor automatycznie wywołuje Close funkcję. Typ SOCKET danych został opisany w artykule Windows Sockets: Background (Gniazda systemu Windows: tło).

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: Using Class CAsyncSocket and related articles., a także Windows Sockets 2 API.

Hierarchia dziedziczenia

CObject

CAsyncSocket

Wymagania

Nagłówek: afxsock.h

CAsyncSocket::Accept

Wywołaj tę funkcję składową, aby zaakceptować połączenie w gniazdach.

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

Parametry

rConnectedSocket
Odwołanie identyfikujące nowe gniazdo, które jest dostępne dla połączenia.

lpSockAddr
Wskaźnik do SOCKADDR struktury, która odbiera adres gniazda łączącego, co jest znane w sieci. Dokładny format argumentu lpSockAddr jest określany przez rodzinę adresów ustanowioną podczas tworzenia gniazda. Jeśli lpSockAddr i/lub lpSockAddrLen są równe NULL, nie są zwracane żadne informacje o zdalnym adresie zaakceptowanego gniazda.

lpSockAddrLen
Wskaźnik do długości adresu w lpSockAddr bajtach. Parametr lpSockAddrLen jest parametrem value-result: początkowo powinien zawierać ilość miejsca wskazywanego przez lpSockAddr; po powrocie będzie zawierać rzeczywistą długość (w bajtach) zwróconego adresu.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen jest za mały (mniejszy niż rozmiar SOCKADDR struktury).

  • WSAEINPROGRESS Trwa blokowanie wywołania gniazd systemu Windows.

  • WSAEINVALListen nie została wywołana przed zaakceptowaniem.

  • WSAEMFILE Kolejka jest pusta po wpisie w celu zaakceptowania i nie ma dostępnych deskryptorów.

  • WSAENOBUFS Brak dostępnego miejsca w buforze.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPP Przywoływne gniazdo nie jest typem obsługującym usługę zorientowaną na połączenie.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące i nie ma żadnych połączeń, które mają zostać zaakceptowane.

Uwagi

Ta rutyna wyodrębnia pierwsze połączenie w kolejce oczekujących połączeń, tworzy nowe gniazdo z tymi samymi właściwościami co to gniazdo i dołącza je do rConnectedSocketelementu . Jeśli w kolejce nie ma oczekujących połączeń, Accept zwraca zero i GetLastError zwraca błąd. Zaakceptowane gniazdo (rConnectedSocket) nie może służyć do akceptowania większej liczby połączeń. Oryginalne gniazdo pozostaje otwarte i nasłuchuje.

Argument lpSockAddr jest parametrem wynikowym wypełnionym adresem gniazda łączącego, znanym z warstwy komunikacji. Accept jest używany z typami gniazd opartych na połączeniu, takimi jak SOCK_STREAM.

CAsyncSocket::AsyncSelect

Wywołaj tę funkcję składową, aby zażądać powiadomienia o zdarzeniu dla gniazda.

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parametry

lEvent
Maska bitowa określająca kombinację zdarzeń sieciowych, w których interesuje się aplikacja.

  • FD_READ Chcesz otrzymywać powiadomienia o gotowości do odczytu.

  • FD_WRITE Chcesz otrzymywać powiadomienia, gdy dane są dostępne do odczytu.

  • FD_OOB Chcesz otrzymywać powiadomienie o nadejściu danych poza pasmem.

  • FD_ACCEPT Chcesz otrzymywać powiadomienia o połączeniach przychodzących.

  • FD_CONNECT Chcesz otrzymywać powiadomienia o wynikach połączenia.

  • FD_CLOSE Chcesz otrzymywać powiadomienia, gdy gniazdo zostało zamknięte przez element równorzędny.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEINVAL Wskazuje, że jeden z określonych parametrów był nieprawidłowy.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

Uwagi

Ta funkcja służy do określania, które funkcje powiadomień wywołania zwrotnego MFC będą wywoływane dla gniazda. AsyncSelect automatycznie ustawia to gniazdo na tryb bezblokowania. Aby uzyskać więcej informacji, zobacz artykuł Windows Sockets: Sockets(Gniazda systemu Windows: powiadomienia o gniazdach).

CAsyncSocket::Attach

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

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parametry

hSocket
Zawiera uchwyt do gniazda.

lEvent
Maska bitowa określająca kombinację zdarzeń sieciowych, w których interesuje się aplikacja.

  • FD_READ Chcesz otrzymywać powiadomienia o gotowości do odczytu.

  • FD_WRITE Chcesz otrzymywać powiadomienia, gdy dane są dostępne do odczytu.

  • FD_OOB Chcesz otrzymywać powiadomienie o nadejściu danych poza pasmem.

  • FD_ACCEPT Chcesz otrzymywać powiadomienia o połączeniach przychodzących.

  • FD_CONNECT Chcesz otrzymywać powiadomienia o wynikach połączenia.

  • FD_CLOSE Chcesz otrzymywać powiadomienia, gdy gniazdo zostało zamknięte przez element równorzędny.

Wartość zwracana

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

Uwagi

Uchwyt SOCKET jest przechowywany w elemencie danych obiektu m_hSocket .

CAsyncSocket::Bind

Wywołaj tę funkcję składową, aby skojarzyć adres lokalny z gniazdem.

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parametry

nSocketPort
Port identyfikujący aplikację gniazda.

lpszSocketAddress
Adres sieciowy, numer kropkowany, taki jak "128.56.22.8". Przekazanie ciągu dla tego parametru NULL wskazuje CAsyncSocket , że wystąpienie powinno nasłuchiwać aktywności klienta we wszystkich interfejsach sieciowych.

lpSockAddr
Wskaźnik do struktury zawierającej SOCKADDR adres do przypisania do tego gniazda.

nSockAddrLen
Długość adresu w lpSockAddr bajtach.

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. Poniższa lista obejmuje kilka błędów, które mogą zostać zwrócone. Aby uzyskać pełną listę, zobacz Kody błędów gniazd systemu Windows.

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEADDRINUSE Określony adres jest już używany. (Zobacz SO_REUSEADDR opcję gniazda w obszarze SetSockOpt.)

  • WSAEFAULT Argument nSockAddrLen jest za mały (mniejszy niż rozmiar SOCKADDR struktury).

  • WSAEINPROGRESS Trwa blokowanie wywołania gniazd systemu Windows.

  • WSAEAFNOSUPPORT Określona rodzina adresów nie jest obsługiwana przez ten port.

  • WSAEINVAL Gniazdo jest już powiązane z adresem.

  • WSAENOBUFS Za mało dostępnych, zbyt wiele połączeń.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

Ta rutyna jest używana na niepołączonego datagramu lub gniazda strumienia przed kolejnymi Connect lub Listen wywołaniami. Przed zaakceptowaniem żądań połączenia gniazdo serwera nasłuchiwania musi wybrać numer portu i powiadom go o gniazdach systemu Windows przez wywołanie metody Bind. Bind ustanawia skojarzenie lokalne (adres hosta/numer portu) gniazda, przypisując nazwę lokalną do gniazda bez nazwy.

CAsyncSocket::CAsyncSocket

Tworzy pusty obiekt gniazda.

CAsyncSocket();

Uwagi

Po utworzeniu obiektu należy wywołać jego Create funkcję składową, aby utworzyć strukturę danych i powiązać SOCKET jej adres. (Po stronie serwera komunikacji windows Sockets, gdy gniazdo nasłuchiwania tworzy gniazdo do użycia w wywołaniu Accept , nie wywołujesz Create tego gniazda).

CAsyncSocket::Close

Zamyka gniazdo.

virtual void Close();

Uwagi

Ta funkcja zwalnia deskryptor gniazd, aby dalsze odwołania do niego nie powiodły się z powodu błędu WSAENOTSOCK. Jeśli jest to ostatnie odwołanie do gniazda bazowego, skojarzone informacje nazewnictwa i dane w kolejce zostaną odrzucone. Destruktor obiektu gniazda wywołuje Close dla Ciebie.

W przypadku CAsyncSocketprogramu , ale nie dla CSocketprogramu , semantyka elementu Close ma wpływ na opcje SO_LINGER gniazd i SO_DONTLINGER. Aby uzyskać więcej informacji, zobacz funkcja GetSockOptskładowa .

CAsyncSocket::Connect

Wywołaj tę funkcję składową, aby nawiązać połączenie z niełączonego strumienia lub gniazda datagramu.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parametry

lpszHostAddress
Adres sieciowy gniazda, z którym jest połączony ten obiekt: nazwa maszyny, taka jak "ftp.microsoft.com" lub kropkowana liczba, taka jak "128.56.22.8".

nHostPort
Port identyfikujący aplikację gniazda.

lpSockAddr
Wskaźnik do SOCKADDR struktury zawierającej adres połączonego gniazda.

nSockAddrLen
Długość adresu w lpSockAddr bajtach.

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. Jeśli wskazuje to kod błędu WSAEWOULDBLOCK, a aplikacja używa przesłonięć wywołań zwrotnych, aplikacja otrzyma OnConnect komunikat po zakończeniu operacji łączenia. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEADDRINUSE Określony adres jest już używany.

  • WSAEINPROGRESS Trwa blokowanie wywołania gniazd systemu Windows.

  • WSAEADDRNOTAVAIL Określony adres nie jest dostępny z komputera lokalnego.

  • WSAEAFNOSUPPORT Adresy w określonej rodzinie nie mogą być używane z tym gniazdem.

  • WSAECONNREFUSED Próba nawiązania połączenia została odrzucona.

  • WSAEDESTADDRREQ Adres docelowy jest wymagany.

  • WSAEFAULT Argument nSockAddrLen jest niepoprawny.

  • WSAEINVAL Nieprawidłowy adres hosta.

  • WSAEISCONN Gniazdo jest już połączone.

  • WSAEMFILE Nie są dostępne deskryptory plików.

  • WSAENETUNREACH Obecnie nie można uzyskać dostępu do sieci z tego hosta.

  • WSAENOBUFS Brak dostępnego miejsca w buforze. Nie można podłączyć gniazda.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAETIMEDOUT Próba nawiązania połączenia upłynął limit czasu bez nawiązywania połączenia.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a połączenie nie można wykonać natychmiast.

Uwagi

Jeśli gniazdo jest niezwiązane, unikatowe wartości są przypisywane do skojarzenia lokalnego przez system, a gniazdo jest oznaczone jako powiązane. Należy pamiętać, że jeśli pole adresu struktury nazw ma wszystkie zera, Connect zwróci zero. Aby uzyskać rozszerzone informacje o błędzie, wywołaj funkcję składową GetLastError .

W przypadku gniazd strumienia (typu SOCK_STREAM) aktywne połączenie jest inicjowane do hosta obcego. Po pomyślnym zakończeniu wywołania gniazda gniazdo jest gotowe do wysyłania/odbierania danych.

W przypadku gniazda datagramu (typu SOCK_DGRAM) ustawiono domyślną lokalizację docelową, która będzie używana w kolejnych Send wywołaniach.Receive

CAsyncSocket::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,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

Parametry

nSocketPort
Dobrze znany port do użycia z gniazdem lub 0, jeśli chcesz, aby gniazda systemu Windows wybierały port.

nSocketType
Usługa SOCK_STREAM lub SOCK_DGRAM.

lEvent
Maska bitowa określająca kombinację zdarzeń sieciowych, w których interesuje się aplikacja.

  • FD_READ Chcesz otrzymywać powiadomienia o gotowości do odczytu.

  • FD_WRITE Chcesz otrzymywać powiadomienia o gotowości do zapisu.

  • FD_OOB Chcesz otrzymywać powiadomienie o nadejściu danych poza pasmem.

  • FD_ACCEPT Chcesz otrzymywać powiadomienia o połączeniach przychodzących.

  • FD_CONNECT Chcesz otrzymywać powiadomienie o ukończonym połączeniu.

  • FD_CLOSE Chcesz otrzymywać powiadomienie o zamknięciu gniazda.

lpszSockAddress
Wskaźnik do ciągu zawierającego adres sieciowy połączonego gniazda, numer kropkowany, taki jak "128.56.22.8". Przekazanie ciągu dla tego parametru NULL wskazuje CAsyncSocket , ż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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEAFNOSUPPORT Określona rodzina adresów nie jest obsługiwana.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEMFILE Nie są dostępne deskryptory plików.

  • WSAENOBUFS Brak dostępnego miejsca w buforze. Nie można utworzyć gniazda.

  • WSAEPROTONOSUPPORT Określony port nie jest obsługiwany.

  • WSAEPROTOTYPE Określony port jest niewłaściwym typem dla tego gniazda.

  • WSAESOCKTNOSUPPORT Określony typ gniazda nie jest obsługiwany w tej rodzinie adresów.

Uwagi

Create wywołuje metodę Socket i jeśli zakończy się pomyślnie, wywoła Bind wywołanie powiązania gniazda z określonym adresem. Obsługiwane są następujące typy gniazd:

  • SOCK_STREAM Zapewnia sekwencjonowane, niezawodne, pełnodupleksowe, oparte na połączeniu strumienie bajtów. 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 pakiety o stałej (zazwyczaj małej) maksymalnej długości. Używa protokołu UDP (User Datagram Protocol) dla rodziny adresów internetowych.

    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.

Ważne

Createnie jest bezpieczny wątkowo. Jeśli wywołujesz je w środowisku wielowątkowym, w którym może być wywoływany jednocześnie przez różne wątki, pamiętaj, aby chronić każde wywołanie za pomocą blokady mutex lub innej synchronizacji.

Aby uzyskać więcej informacji na temat gniazd strumienia i datagramu, zobacz artykuły Windows Sockets: Background and Windows Sockets: Ports and Sockets and Sockets 2 API (Gniazda systemu Windows: porty i adresy gniazd i gniazda systemu Windows 2).

CAsyncSocket::CreateEx

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

Użyj tej funkcji, jeśli musisz podać zaawansowane opcje, takie jak typ gniazda.

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parametry

pAI
Wskaźnik do ADDRINFOT przechowywania informacji o gniazdach, takich jak rodzina i typ gniazda.

lEvent
Maska bitowa określająca kombinację zdarzeń sieciowych, w których interesuje się aplikacja.

  • FD_READ Chcesz otrzymywać powiadomienia o gotowości do odczytu.

  • FD_WRITE Chcesz otrzymywać powiadomienia o gotowości do zapisu.

  • FD_OOB Chcesz otrzymywać powiadomienie o nadejściu danych poza pasmem.

  • FD_ACCEPT Chcesz otrzymywać powiadomienia o połączeniach przychodzących.

  • FD_CONNECT Chcesz otrzymywać powiadomienie o ukończonym połączeniu.

  • FD_CLOSE Chcesz otrzymywać powiadomienie o zamknięciu gniazda.

Wartość zwracana

Zobacz wartość zwracaną dla elementu Create().

Uwagi

Zobacz uwagi dotyczące elementu Create().

CAsyncSocket::Detach

Wywołaj tę funkcję składową, aby odłączyć SOCKET uchwyt w elemencie m_hSocket CAsyncSocket członkowskim danych od obiektu i ustawić wartość m_hSocket NULL.

SOCKET Detach();

CAsyncSocket::FromHandle

Zwraca wskaźnik do CAsyncSocket obiektu.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parametry

hSocket
Zawiera uchwyt do gniazda.

Wartość zwracana

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

Uwagi

Jeśli dany SOCKET uchwyt, jeśli CAsyncSocket obiekt nie jest dołączony do uchwytu, funkcja składowa zwraca wartość NULL.

CAsyncSocket::GetLastError

Wywołaj tę funkcję składową, aby uzyskać stan błędu ostatniej operacji, która nie powiodła się.

static int PASCAL GetLastError();

Wartość zwracana

Wartość zwracana wskazuje kod błędu dla ostatniej procedury interfejsu API gniazd systemu Windows wykonywanej przez ten wątek.

Uwagi

Gdy określona funkcja składowa wskazuje, że wystąpił błąd, należy wywołać polecenie w GetLastError celu pobrania odpowiedniego kodu błędu. Zobacz opisy poszczególnych funkcji składowych, aby uzyskać listę odpowiednich kodów błędów.

Aby uzyskać więcej informacji na temat kodów błędów, zobacz Interfejs API windows Sockets 2.

CAsyncSocket::GetPeerName

Wywołaj tę funkcję składową, aby uzyskać adres gniazda równorzędnego, z którym jest podłączone to gniazdo.

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parametry

rPeerAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rPeerPort
Odwołanie do folderu UINT przechowującego port.

lpSockAddr
Wskaźnik do SOCKADDR struktury, która otrzymuje nazwę gniazda równorzędnego.

lpSockAddrLen
Wskaźnik do długości adresu w lpSockAddr bajtach. Po powrocie lpSockAddrLen argument zawiera rzeczywisty rozmiar lpSockAddr zwracany w bajtach.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen nie jest wystarczająco duży.

  • WSAEINPROGRESS Trwa blokowanie wywołania gniazd systemu Windows.

  • WSAENOTCONN Gniazdo nie jest połączone.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

Aby obsłużyć adresy IPv6, użyj polecenia CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Wywołaj tę funkcję składową, aby uzyskać adres gniazda równorzędnego, z którym jest podłączone to gniazdo (obsługuje adresy IPv6).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Parametry

rPeerAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rPeerPort
Odwołanie do folderu UINT przechowującego port.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen nie jest wystarczająco duży.

  • WSAEINPROGRESS Trwa blokowanie wywołania gniazd systemu Windows.

  • WSAENOTCONN Gniazdo nie jest połączone.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

Ta funkcja jest taka sama jak CAsyncSocket::GetPeerName w przypadku obsługi adresów IPv6, a także starszych protokołów.

CAsyncSocket::GetSockName

Wywołaj tę funkcję składową, aby uzyskać nazwę lokalną gniazda.

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parametry

rSocketAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rSocketPort
Odwołanie do folderu UINT przechowującego port.

lpSockAddr
Wskaźnik do SOCKADDR struktury, która odbiera adres gniazda.

lpSockAddrLen
Wskaźnik do długości adresu w lpSockAddr bajtach.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen nie jest wystarczająco duży.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEINVAL Gniazdo nie zostało powiązane z adresem o adresie Bind.

Uwagi

To wywołanie jest szczególnie przydatne, gdy Connect wykonano wywołanie bez uprzedniego wykonania Bind . To wywołanie zapewnia jedyny sposób, za pomocą którego można określić skojarzenie lokalne, które zostało ustawione przez system.

Aby obsługiwać adresy IPv6, użyj polecenia CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Wywołaj tę funkcję składową, aby uzyskać nazwę lokalną gniazda (obsługuje adresy IPv6).

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

Parametry

rSocketAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rSocketPort
Odwołanie do folderu UINT przechowującego port.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen nie jest wystarczająco duży.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEINVAL Gniazdo nie zostało powiązane z adresem o adresie Bind.

Uwagi

To wywołanie jest takie samo jak CAsyncSocket::GetSockName w przypadku obsługi adresów IPv6, a także starszych protokołów.

To wywołanie jest szczególnie przydatne, gdy Connect wykonano wywołanie bez uprzedniego wykonania Bind . To wywołanie zapewnia jedyny sposób, za pomocą którego można określić skojarzenie lokalne, które zostało ustawione przez system.

CAsyncSocket::GetSockOpt

Wywołaj tę funkcję składową, aby pobrać opcję gniazda.

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

Parametry

nOptionName
Opcja gniazda, dla której ma zostać pobrana wartość.

lpOptionValue
Wskaźnik do buforu, w którym ma zostać zwrócona wartość żądanej opcji. Wartość skojarzona z wybraną opcją jest zwracana w buforze lpOptionValue. Liczba całkowita wskazywana lpOptionLen przez powinna pierwotnie zawierać rozmiar tego buforu w bajtach, a po powrocie zostanie ustawiona na rozmiar zwracanej wartości. W przypadku SO_LINGERparametru LINGER będzie to rozmiar struktury; dla wszystkich innych opcji będzie to rozmiar WARTOŚCI LOGICZNEj lub int, w zależności od opcji. Zobacz listę opcji i ich rozmiarów w sekcji Uwagi.

lpOptionLen
Wskaźnik do rozmiaru buforu lpOptionValue w bajtach.

nLevel
Poziom, na którym zdefiniowano opcję; jedynymi obsługiwanymi poziomami są SOL_SOCKET i IPPROTO_TCP.

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. Jeśli opcja nigdy nie została ustawiona z opcją SetSockOpt, zwraca GetSockOpt wartość domyślną dla opcji . Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpOptionLen był nieprawidłowy.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOPROTOOPT Opcja jest nieznana lub nieobsługiwana. W szczególności SO_BROADCAST nie jest obsługiwane w gniazdach typu SOCK_STREAM, podczas gdy SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERi SO_OOBINLINE nie są obsługiwane w gniazdach typu SOCK_DGRAM.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

GetSockOpt pobiera bieżącą wartość dla opcji gniazda skojarzonej z gniazdem dowolnego typu, w dowolnym stanie i przechowuje wynik w lpOptionValue. Opcje wpływają na operacje gniazd, takie jak routing pakietów, transfer danych poza pasmem itd.

Następujące opcje są obsługiwane dla programu GetSockOpt. Typ identyfikuje typ danych adresowanych przez lpOptionValueelement . Opcja TCP_NODELAY używa poziomu IPPROTO_TCP; wszystkie inne opcje używają poziomu SOL_SOCKET.

Wartość Typ Znaczenie
SO_ACCEPTCONN BOOL Gniazdo nasłuchuje.
SO_BROADCAST BOOL Gniazdo jest skonfigurowane do transmisji komunikatów rozgłaszanych.
SO_DEBUG BOOL Debugowanie jest włączone.
SO_DONTLINGER BOOL Jeśli wartość true, opcja jest wyłączona SO_LINGER .
SO_DONTROUTE BOOL Routing jest wyłączony.
SO_ERROR int Pobieranie stanu błędu i czyszczenie.
SO_KEEPALIVE BOOL Są wysyłane elementy keep-alive.
SO_LINGER struct LINGER Zwraca bieżące opcje utrzymujące się.
SO_OOBINLINE BOOL Dane poza pasmem są odbierane w normalnym strumieniu danych.
SO_RCVBUF int Rozmiar buforu dla odbieranych.
SO_REUSEADDR BOOL Gniazdo może być powiązane z adresem, który jest już używany.
SO_SNDBUF int Rozmiar buforu dla wysyłania.
SO_TYPE int Typ gniazda (na przykład SOCK_STREAM).
TCP_NODELAY BOOL Wyłącza algorytm Nagle na potrzeby łączenia.

Opcje dystrybucji oprogramowania Berkeley (BSD) nie są obsługiwane w następujących celach GetSockOpt :

Wartość Typ Znaczenie
SO_RCVLOWAT int Odbierz niski znak wody.
SO_RCVTIMEO int Limit czasu odbierania.
SO_SNDLOWAT int Wyślij niski znacznik wody.
SO_SNDTIMEO int Limit czasu wysyłania.
IP_OPTIONS Pobierz opcje w nagłówku adresu IP.
TCP_MAXSEG int Uzyskaj maksymalny rozmiar segmentu TCP.

Wywołanie GetSockOpt z nieobsługiwaną opcją spowoduje zwrócenie kodu błędu WSAENOPROTOOPT z pliku GetLastError.

CAsyncSocket::IOCtl

Wywołaj tę funkcję składową, aby kontrolować tryb gniazda.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Parametry

lCommand
Polecenie do wykonania w gniazdie.

lpArgument
Wskaźnik do parametru .lCommand

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEINVALlCommand nie jest prawidłowym poleceniem lub lpArgument nie jest dopuszczalnym parametrem dla lCommand, lub polecenie nie ma zastosowania do typu dostarczonego gniazda.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

Ta rutyna może być używana na dowolnym gniazdach w dowolnym stanie. Służy do pobierania lub pobierania parametrów operacyjnych skojarzonych z gniazdem, niezależnie od podsystemu protokołu i komunikacji. Obsługiwane są następujące polecenia:

  • FIONBIO Włącz lub wyłącz tryb bezblokowania na gniazdach. Parametr lpArgument wskazuje wartość DWORD, która jest niezerowa, jeśli tryb bezblokowania ma być włączony i zero, jeśli ma zostać wyłączony. Jeśli AsyncSelect zostało wystawione na gniazdo, każda próba użycia IOCtl polecenia w celu ustawienia gniazda z powrotem do trybu blokowania zakończy się niepowodzeniem z .WSAEINVAL Aby ustawić gniazdo z powrotem w tryb blokowania i zapobiec WSAEINVAL błędowi, aplikacja musi najpierw wyłączyć AsyncSelect wywołanie AsyncSelect parametru lEvent o wartości równej 0, a następnie wywołać metodę IOCtl.

  • FIONREAD Określ maksymalną liczbę bajtów, które można odczytać za pomocą jednego Receive wywołania z tego gniazda. Parametr lpArgument wskazuje, DWORD w którym IOCtl przechowuje wynik. Jeśli to gniazdo jest typu SOCK_STREAM, FIONREAD zwraca łączną ilość danych, które można odczytać w jednym miejscu Receive; jest to zwykle takie samo, jak łączna ilość danych w kolejce do gniazda. Jeśli to gniazdo jest typu SOCK_DGRAM, FIONREAD zwraca rozmiar pierwszego datagramu w kolejce do gniazda.

  • SIOCATMARK Ustal, czy wszystkie dane poza pasmem zostały odczytane. Dotyczy to tylko gniazda typu SOCK_STREAM skonfigurowanego do odbioru danych poza pasmem ( SO_OOBINLINE). Jeśli żadne dane poza pasmem nie czekają na odczytanie, operacja zwraca wartość niezerową. W przeciwnym razie zwraca wartość 0, a następne Receive lub ReceiveFrom wykonane na gniazdach pobierze niektóre lub wszystkie dane poprzedzające znak; aplikacja powinna użyć SIOCATMARK operacji w celu określenia, czy jakiekolwiek dane pozostają. Jeśli istnieją jakiekolwiek normalne dane poprzedzające dane "pilne" (poza pasmem), zostaną odebrane w kolejności. (Należy pamiętać, że element lub ReceiveFrom nigdy nie będzie mieszać poza pasmem Receive i normalnych danych w tym samym wywołaniu). Parametr lpArgument wskazuje, DWORD w którym IOCtl przechowuje wynik.

Ta funkcja jest podzbiorem ioctl() używanym w gniazdach Berkeley. W szczególności nie ma polecenia, które jest równoważne FIOASYNCfunkcji , natomiast SIOCATMARK jest jedynym poleceniem na poziomie gniazda, które jest obsługiwane.

CAsyncSocket::Listen

Wywołaj tę funkcję składową, aby nasłuchiwać przychodzących żądań połączeń.

BOOL Listen(int nConnectionBacklog = 5);

Parametry

nConnectionBacklog
Maksymalna długość kolejki oczekujących połączeń może wzrosnąć. Prawidłowy zakres to od 1 do 5.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEADDRINUSE Podjęto próbę nasłuchiwania adresu w użyciu.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEINVAL Gniazdo nie zostało powiązane z Bind lub jest już połączone.

  • WSAEISCONN Gniazdo jest już połączone.

  • WSAEMFILE Nie są dostępne deskryptory plików.

  • WSAENOBUFS Brak dostępnego miejsca w buforze.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPP Przywoływne gniazdo nie jest typem, który obsługuje operację Listen .

Uwagi

Aby zaakceptować połączenia, gniazdo jest najpierw tworzone za pomocą Createpolecenia , listę prac dla połączeń przychodzących jest określona za pomocą Listenpolecenia , a następnie połączenia są akceptowane za pomocą Acceptpolecenia . Listen dotyczy tylko gniazd, które obsługują połączenia, czyli tych typu SOCK_STREAM. To gniazdo jest umieszczane w trybie "pasywnym", w którym połączenia przychodzące są potwierdzane i umieszczane w kolejce oczekujące na akceptację przez proces.

Ta funkcja jest zwykle używana przez serwery (lub dowolną aplikację, która chce akceptować połączenia), która może mieć więcej niż jedno żądanie połączenia w danym momencie: jeśli żądanie połączenia zostanie odebrane z pełną kolejką, klient otrzyma błąd ze wskazaniem WSAECONNREFUSED.

Listen próbuje nadal działać racjonalnie, gdy nie ma dostępnych portów (deskryptorów). Będzie on akceptować połączenia do momentu opróżninia kolejki. Jeśli porty staną się dostępne, późniejsze wywołanie lub Listen Accept ponownie wypełni kolejkę do bieżącej lub najnowszej listy prac, jeśli to możliwe, i wznowi nasłuchiwanie połączeń przychodzących.

CAsyncSocket::m_hSocket

SOCKET Zawiera uchwyt dla gniazda hermetyzowanego przez ten CAsyncSocket obiekt.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Wywoływana przez platformę w celu powiadomienia gniazda nasłuchiwania, że może akceptować oczekujące żądania połączenia przez wywołanie funkcji składowej Accept .

virtual void OnAccept(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnAccept :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

Uwagi

Aby uzyskać więcej informacji, zobacz Windows Sockets: Socket Notifications (Gniazda systemu Windows: powiadomienia o gniazdach).

CAsyncSocket::OnClose

Wywoływana przez strukturę w celu powiadomienia tego gniazda o zamknięciu podłączonego gniazda przez jego proces.

virtual void OnClose(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnClose :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAECONNRESET Połączenie zostało zresetowane po stronie zdalnej.

  • WSAECONNABORTED Połączenie zostało przerwane z powodu przekroczenia limitu czasu lub innego błędu.

Uwagi

Aby uzyskać więcej informacji, zobacz Windows Sockets: Socket Notifications (Gniazda systemu Windows: powiadomienia o gniazdach).

CAsyncSocket::OnConnect

Wywoływana przez platformę w celu powiadomienia tego gniazda połączenia o zakończeniu próby nawiązania połączenia, niezależnie od tego, czy zakończyła się powodzeniem, czy błędem.

virtual void OnConnect(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnConnect :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAEADDRINUSE Określony adres jest już używany.

  • WSAEADDRNOTAVAIL Określony adres nie jest dostępny z komputera lokalnego.

  • WSAEAFNOSUPPORT Adresy w określonej rodzinie nie mogą być używane z tym gniazdem.

  • WSAECONNREFUSED Próba nawiązania połączenia została wymuszono odrzucona.

  • WSAEDESTADDRREQ Adres docelowy jest wymagany.

  • WSAEFAULT Argument lpSockAddrLen jest niepoprawny.

  • WSAEINVAL Gniazdo jest już powiązane z adresem.

  • WSAEISCONN Gniazdo jest już połączone.

  • WSAEMFILE Nie są dostępne deskryptory plików.

  • WSAENETUNREACH Obecnie nie można uzyskać dostępu do sieci z tego hosta.

  • WSAENOBUFS Brak dostępnego miejsca w buforze. Nie można podłączyć gniazda.

  • WSAENOTCONN Gniazdo nie jest połączone.

  • WSAENOTSOCK Deskryptor jest plikiem, a nie gniazdem.

  • WSAETIMEDOUT Próba nawiązania połączenia upłynął limit czasu bez nawiązania połączenia.

Uwagi

Uwaga

W CSocketsystemie funkcja powiadamiania OnConnect nigdy nie jest wywoływana. W przypadku połączeń po prostu wywołasz metodę Connect, która zostanie zwrócona po zakończeniu połączenia (pomyślnie lub w błędzie). Sposób obsługi powiadomień o połączeniu to szczegóły implementacji MFC.

Aby uzyskać więcej informacji, zobacz Windows Sockets: Socket Notifications (Gniazda systemu Windows: powiadomienia o gniazdach).

Przykład

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

Wywoływana przez strukturę w celu powiadomienia gniazda odbierającego, że gniazdo wysyłające ma dane poza pasmem do wysłania.

virtual void OnOutOfBandData(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnOutOfBandData :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

Uwagi

Dane poza pasmem to logicznie niezależny kanał skojarzony z każdą parą połączonych gniazd typu SOCK_STREAM. Kanał jest zwykle używany do wysyłania pilnych danych.

MFC obsługuje dane poza pasmem, ale użytkownicy klasy CAsyncSocket nie są zniechęceni do korzystania z niej. Łatwiejszym sposobem jest utworzenie drugiego gniazda do przekazywania takich danych. Aby uzyskać więcej informacji na temat danych poza pasmem, zobacz Windows Sockets: Sockets: Socket Notifications (Gniazda: powiadomienia gniazda).

CAsyncSocket::OnReceive

Wywoływana przez platformę w celu powiadomienia tego gniazda o tym, że w buforze znajdują się dane, które można pobrać, wywołując Receive funkcję składową.

virtual void OnReceive(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnReceive :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

Uwagi

Aby uzyskać więcej informacji, zobacz Windows Sockets: Socket Notifications (Gniazda systemu Windows: powiadomienia o gniazdach).

Przykład

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

Wywoływana przez platformę w celu powiadomienia gniazda, że może teraz wysyłać dane przez wywołanie funkcji składowej Send .

virtual void OnSend(int nErrorCode);

Parametry

nErrorCode
Najnowszy błąd w gniazdach. Następujące kody błędów dotyczą funkcji składowej OnSend :

  • 0 Funkcja została wykonana pomyślnie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

Uwagi

Aby uzyskać więcej informacji, zobacz Windows Sockets: Socket Notifications (Gniazda systemu Windows: powiadomienia o gniazdach).

Przykład

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

Przypisuje nową wartość do CAsyncSocket obiektu.

void operator=(const CAsyncSocket& rSrc);

Parametry

rSrc
Odwołanie do istniejącego CAsyncSocket obiektu.

Uwagi

Wywołaj tę funkcję, aby skopiować istniejący CAsyncSocket obiekt do innego CAsyncSocket obiektu.

CAsyncSocket::operator SOCKET

Użyj tego operatora, aby pobrać SOCKET uchwyt CAsyncSocket obiektu.

operator SOCKET() const;

Wartość zwracana

W przypadku powodzenia SOCKET dojście do obiektu; w przeciwnym razie NULL.

Uwagi

Uchwyt umożliwia bezpośrednie wywoływanie interfejsów API systemu Windows.

CAsyncSocket::Receive

Wywołaj tę funkcję składową, aby odbierać dane z gniazda.

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parametry

lpBuf
Bufor dla danych przychodzących.

nBufLen
Długość bajtów lpBuf .

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_PEEK Przyjrzyj się przychodzącym danym. Dane są kopiowane do buforu, ale nie są usuwane z kolejki wejściowej.

  • MSG_OOB Przetwarzanie danych poza pasmem.

Wartość zwracana

Jeśli wystąpi żaden błąd, Receive zwraca liczbę odebranych bajtów. Jeśli połączenie zostało zamknięte, zwraca wartość 0. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAENOTCONN Gniazdo nie jest połączone.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać Receive gniazda po ShutDown wywołaniu z ustawionym nHow na 0 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a Receive operacja zostanie zablokowana.

  • WSAEMSGSIZE Datagram był zbyt duży, aby zmieścić się w określonym buforze i został obcięty.

  • WSAEINVAL Gniazdo nie zostało powiązane z elementem Bind.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

Uwagi

Ta funkcja jest używana do podłączanego strumienia lub gniazd datagramu i służy do odczytywania danych przychodzących.

W przypadku gniazd typu SOCK_STREAMzwracana jest tyle informacji, ile jest obecnie dostępnych do rozmiaru dostarczonego buforu. Jeśli gniazdo zostało skonfigurowane do odbioru danych poza pasmem (opcja SO_OOBINLINEgniazda ) i dane poza pasmem są nieprzeczytane, zwracane będą tylko dane poza pasmem. Aplikacja może użyć IOCtlSIOCATMARK opcji lub OnOutOfBandData określić, czy dane poza pasmem pozostają do odczytania.

W przypadku gniazd datagramu dane są wyodrębniane z pierwszego w kolejce datagramu do rozmiaru dostarczonego buforu. Jeśli datagram jest większy niż podany bufor, bufor jest wypełniony pierwszą częścią datagramu, nadmiar danych zostanie utracony i Receive zwraca wartość SOCKET_ERROR z kodem błędu ustawionym na WSAEMSGSIZEwartość . Jeśli w gniazdie nie są dostępne żadne dane przychodzące, zostanie zwrócona wartość SOCKET_ERROR z kodem błędu ustawionym na WSAEWOULDBLOCKwartość . Funkcja OnReceive wywołania zwrotnego może służyć do określania, kiedy przybywa więcej danych.

Jeśli gniazdo jest typu SOCK_STREAM , a po stronie zdalnej zostanie bezpiecznie zamknięte połączenie, Receive element zostanie natychmiast ukończony z 0 bajtów odebranych. Jeśli połączenie zostało zresetowane, błąd Receive zakończy się niepowodzeniem z powodu błędu WSAECONNRESET.

Receive powinien być wywoływany tylko raz za każdym razem CAsyncSocket::OnReceive .

Przykład

Zobacz przykład dla elementu CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Wywołaj tę funkcję składową, aby otrzymać datagram i zapisać adres źródłowy w strukturze lub w elemencie SOCKADDR rSocketAddress.

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

Parametry

lpBuf
Bufor dla danych przychodzących.

nBufLen
Długość bajtów lpBuf .

rSocketAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rSocketPort
Odwołanie do folderu UINT przechowującego port.

lpSockAddr
Wskaźnik do SOCKADDR struktury, która przechowuje adres źródłowy po powrocie.

lpSockAddrLen
Wskaźnik do długości adresu źródłowego w lpSockAddr bajtach.

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_PEEK Przyjrzyj się przychodzącym danym. Dane są kopiowane do buforu, ale nie są usuwane z kolejki wejściowej.

  • MSG_OOB Przetwarzanie danych poza pasmem.

Wartość zwracana

Jeśli wystąpi żaden błąd, ReceiveFrom zwraca liczbę odebranych bajtów. Jeśli połączenie zostało zamknięte, zwraca wartość 0. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen był nieprawidłowy: lpSockAddr bufor był zbyt mały, aby pomieścić adres równorzędny.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEINVAL Gniazdo nie zostało powiązane z elementem Bind.

  • WSAENOTCONN Gniazdo nie jest połączone (SOCK_STREAM tylko).

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać ReceiveFrom gniazda po ShutDown wywołaniu z ustawionym nHow na 0 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a ReceiveFrom operacja zostanie zablokowana.

  • WSAEMSGSIZE Datagram był zbyt duży, aby zmieścić się w określonym buforze i został obcięty.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

Uwagi

Ta funkcja służy do odczytywania danych przychodzących w gniazdie (prawdopodobnie połączonym) i przechwytywania adresu, z którego dane zostały wysłane.

Aby obsłużyć adresy IPv6, użyj polecenia CAsyncSocket::ReceiveFromEx.

W przypadku gniazd typu SOCK_STREAMzwracana jest tyle informacji, ile jest obecnie dostępnych do rozmiaru dostarczonego buforu. Jeśli gniazdo zostało skonfigurowane do odbioru danych poza pasmem (opcja SO_OOBINLINEgniazda ) i dane poza pasmem są nieprzeczytane, zwracane będą tylko dane poza pasmem. Aplikacja może użyć IOCtlSIOCATMARK opcji lub OnOutOfBandData określić, czy dane poza pasmem pozostają do odczytania. Parametry lpSockAddr i lpSockAddrLen są ignorowane dla SOCK_STREAM gniazd.

W przypadku gniazd datagramu dane są wyodrębniane z pierwszego w kolejce datagramu do rozmiaru dostarczonego buforu. Jeśli datagram jest większy niż podany bufor, bufor jest wypełniony pierwszą częścią komunikatu, nadmiar danych zostanie utracony i ReceiveFrom zwróci wartość SOCKET_ERROR z kodem błędu ustawionym na WSAEMSGSIZEwartość .

Jeśli lpSockAddr jest nonzero, a gniazdo jest typu SOCK_DGRAM, adres sieciowy gniazda, który wysłał dane jest kopiowany do odpowiedniej SOCKADDR struktury. Wartość wskazywana przez lpSockAddrLen jest inicjowana do rozmiaru tej struktury i jest modyfikowana po powrocie, aby wskazać rzeczywisty rozmiar adresu tam przechowywanego. Jeśli w gniazdie nie są dostępne żadne dane przychodzące, wywołanie czeka na odebranie danych, ReceiveFrom chyba że gniazdo nie zostanie odblokowane. W takim przypadku wartość SOCKET_ERROR jest zwracana z kodem błędu ustawionym na WSAEWOULDBLOCKwartość . Wywołanie OnReceive zwrotne może służyć do określania, kiedy przybywa więcej danych.

Jeśli gniazdo jest typu SOCK_STREAM , a po stronie zdalnej zostanie bezpiecznie zamknięte połączenie, ReceiveFrom element zostanie natychmiast ukończony z 0 bajtów odebranych.

CAsyncSocket::ReceiveFromEx

Wywołaj tę funkcję składową, aby otrzymać datagram i zapisać adres źródłowy w SOCKADDR strukturze lub w rSocketAddress (obsługuje adresy IPv6).

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

Parametry

lpBuf
Bufor dla danych przychodzących.

nBufLen
Długość bajtów lpBuf .

rSocketAddress
Odwołanie do CString obiektu, który odbiera adres IP z numerem kropkowym.

rSocketPort
Odwołanie do folderu UINT przechowującego port.

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_PEEK Przyjrzyj się przychodzącym danym. Dane są kopiowane do buforu, ale nie są usuwane z kolejki wejściowej.

  • MSG_OOB Przetwarzanie danych poza pasmem.

Wartość zwracana

Jeśli wystąpi żaden błąd, ReceiveFromEx zwraca liczbę odebranych bajtów. Jeśli połączenie zostało zamknięte, zwraca wartość 0. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULT Argument lpSockAddrLen był nieprawidłowy: lpSockAddr bufor był zbyt mały, aby pomieścić adres równorzędny.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEINVAL Gniazdo nie zostało powiązane z elementem Bind.

  • WSAENOTCONN Gniazdo nie jest połączone (SOCK_STREAM tylko).

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać ReceiveFromEx gniazda po ShutDown wywołaniu z ustawionym nHow na 0 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a ReceiveFromEx operacja zostanie zablokowana.

  • WSAEMSGSIZE Datagram był zbyt duży, aby zmieścić się w określonym buforze i został obcięty.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

Uwagi

Ta funkcja służy do odczytywania danych przychodzących w gniazdie (prawdopodobnie połączonym) i przechwytywania adresu, z którego dane zostały wysłane.

Ta funkcja jest taka sama jak CAsyncSocket::ReceiveFrom w przypadku obsługi adresów IPv6, a także starszych protokołów.

W przypadku gniazd typu SOCK_STREAMzwracana jest tyle informacji, ile jest obecnie dostępnych do rozmiaru dostarczonego buforu. Jeśli gniazdo zostało skonfigurowane do odbioru danych poza pasmem (opcja SO_OOBINLINEgniazda ) i dane poza pasmem są nieprzeczytane, zwracane będą tylko dane poza pasmem. Aplikacja może użyć IOCtlSIOCATMARK opcji lub OnOutOfBandData określić, czy dane poza pasmem pozostają do odczytania. Parametry lpSockAddr i lpSockAddrLen są ignorowane dla SOCK_STREAM gniazd.

W przypadku gniazd datagramu dane są wyodrębniane z pierwszego w kolejce datagramu do rozmiaru dostarczonego buforu. Jeśli datagram jest większy niż podany bufor, bufor jest wypełniony pierwszą częścią komunikatu, nadmiar danych zostanie utracony i ReceiveFromEx zwróci wartość SOCKET_ERROR z kodem błędu ustawionym na WSAEMSGSIZEwartość .

Jeśli lpSockAddr jest nonzero, a gniazdo jest typu SOCK_DGRAM, adres sieciowy gniazda, który wysłał dane jest kopiowany do odpowiedniej SOCKADDR struktury. Wartość wskazywana przez lpSockAddrLen jest inicjowana do rozmiaru tej struktury i jest modyfikowana po powrocie, aby wskazać rzeczywisty rozmiar adresu tam przechowywanego. Jeśli w gniazdie nie są dostępne żadne dane przychodzące, wywołanie czeka na odebranie danych, ReceiveFromEx chyba że gniazdo nie zostanie odblokowane. W takim przypadku wartość SOCKET_ERROR jest zwracana z kodem błędu ustawionym na WSAEWOULDBLOCKwartość . Wywołanie OnReceive zwrotne może służyć do określania, kiedy przybywa więcej danych.

Jeśli gniazdo jest typu SOCK_STREAM , a po stronie zdalnej zostanie bezpiecznie zamknięte połączenie, ReceiveFromEx element zostanie natychmiast ukończony z 0 bajtów odebranych.

CAsyncSocket::Send

Wywołaj tę funkcję składową, aby wysyłać dane do połączonego gniazda.

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parametry

lpBuf
Bufor zawierający dane, które mają być przesyłane.

nBufLen
Długość danych w lpBuf bajtach.

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_DONTROUTE Określa, że dane nie powinny podlegać routingowi. Dostawca windows Sockets może wybrać, aby zignorować tę flagę.

  • MSG_OOB Wysyłaj dane poza pasmem (SOCK_STREAM tylko).

Wartość zwracana

Jeśli żaden błąd nie wystąpi, Send zwraca łączną liczbę wysłanych znaków. (Należy pamiętać, że może to być mniejsza niż liczba wskazana przez nBufLen. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEACCES Żądany adres jest adresem emisji, ale nie ustawiono odpowiedniej flagi.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEFAULT Argument lpBuf nie znajduje się w prawidłowej części przestrzeni adresowej użytkownika.

  • WSAENETRESET Połączenie musi zostać zresetowane, ponieważ implementacja gniazd systemu Windows została porzucona.

  • WSAENOBUFS Implementacja gniazd systemu Windows zgłasza zakleszczenie buforu.

  • WSAENOTCONN Gniazdo nie jest połączone.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać Send gniazda po ShutDown wywołaniu z ustawionym nHow na 1 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.

  • WSAEMSGSIZE Gniazdo jest typu SOCK_DGRAM, a datagram jest większy niż maksymalna obsługiwana przez implementację gniazd systemu Windows.

  • WSAEINVAL Gniazdo nie zostało powiązane z elementem Bind.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

Uwagi

Send służy do zapisywania danych wychodzących w połączonym strumieniu lub gniazdach datagramu. W przypadku gniazd datagramu należy zachować ostrożność, aby nie przekraczać maksymalnego rozmiaru pakietów IP bazowych podsieci, które są podane przez iMaxUdpDg element w WSADATA strukturze zwracanej przez AfxSocketInit. Jeśli dane są zbyt długie, aby przekazywać niepodziecznie przez protokół bazowy, błąd WSAEMSGSIZE jest zwracany za pośrednictwem GetLastErrormetody i nie są przesyłane żadne dane.

Należy pamiętać, że w przypadku gniazda datagramu pomyślne ukończenie elementu Send nie wskazuje, że dane zostały pomyślnie dostarczone.

W CAsyncSocket przypadku obiektów typu SOCK_STREAMliczba zapisanych bajtów może wynosić od 1 do żądanej długości, w zależności od dostępności buforu zarówno na hostach lokalnych, jak i zagranicznych.

Przykład

Zobacz przykład dla elementu CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Wywołaj tę funkcję składową, aby wysyłać dane do określonego miejsca docelowego.

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

Parametry

lpBuf
Bufor zawierający dane, które mają być przesyłane.

nBufLen
Długość danych w lpBuf bajtach.

nHostPort
Port identyfikujący aplikację gniazda.

lpszHostAddress
Adres sieciowy gniazda, z którym jest połączony ten obiekt: nazwa maszyny, taka jak "ftp.microsoft.com" lub kropkowana liczba, taka jak "128.56.22.8".

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_DONTROUTE Określa, że dane nie powinny podlegać routingowi. Dostawca windows Sockets może wybrać, aby zignorować tę flagę.

  • MSG_OOB Wysyłaj dane poza pasmem (SOCK_STREAM tylko).

lpSockAddr
Wskaźnik do SOCKADDR struktury zawierającej adres gniazda docelowego.

nSockAddrLen
Długość adresu w lpSockAddr bajtach.

Wartość zwracana

Jeśli żaden błąd nie wystąpi, SendTo zwraca łączną liczbę wysłanych znaków. (Należy pamiętać, że może to być mniejsza niż liczba wskazana przez nBufLen. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEACCES Żądany adres jest adresem emisji, ale nie ustawiono odpowiedniej flagi.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEFAULT Parametry lpBuf lub lpSockAddr nie są częścią przestrzeni adresowej użytkownika lub lpSockAddr argument jest zbyt mały (mniejszy niż rozmiar SOCKADDR struktury).

  • WSAEINVAL Nazwa hosta jest nieprawidłowa.

  • WSAENETRESET Połączenie musi zostać zresetowane, ponieważ implementacja gniazd systemu Windows została porzucona.

  • WSAENOBUFS Implementacja gniazd systemu Windows zgłasza zakleszczenie buforu.

  • WSAENOTCONN Gniazdo nie jest połączone (SOCK_STREAM tylko).

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać SendTo gniazda po ShutDown wywołaniu z ustawionym nHow na 1 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.

  • WSAEMSGSIZE Gniazdo jest typu SOCK_DGRAM, a datagram jest większy niż maksymalna obsługiwana przez implementację gniazd systemu Windows.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

  • WSAEADDRNOTAVAIL Określony adres nie jest dostępny z komputera lokalnego.

  • WSAEAFNOSUPPORT Adresy w określonej rodzinie nie mogą być używane z tym gniazdem.

  • WSAEDESTADDRREQ Adres docelowy jest wymagany.

  • WSAENETUNREACH Obecnie nie można uzyskać dostępu do sieci z tego hosta.

Uwagi

SendTo jest używany na datagramie lub gniazdach strumienia i służy do zapisywania danych wychodzących na gniazdach. W przypadku gniazd datagramu należy zachować ostrożność, aby nie przekraczać maksymalnego rozmiaru pakietów IP bazowych podsieci, które są podane przez iMaxUdpDg element w WSADATA strukturze wypełnionej przez AfxSocketInit. Jeśli dane są zbyt długie, aby przekazywać niepodzielne dane za pośrednictwem podstawowego protokołu, zwracany jest błąd WSAEMSGSIZE i nie są przesyłane żadne dane.

Należy pamiętać, że pomyślne ukończenie obiektu SendTo nie wskazuje, że dane zostały pomyślnie dostarczone.

SendTo jest używany tylko na SOCK_DGRAM gniazdach do wysyłania datagramu do określonego gniazda zidentyfikowanego przez lpSockAddr parametr .

Aby wysłać emisję (tylko), adres w parametrze SOCK_DGRAM lpSockAddr powinien być skonstruowany przy użyciu specjalnego adresu INADDR_BROADCAST IP (zdefiniowanego w pliku WINSOCK.Hnagłówka Windows Sockets) wraz z zamierzonym numerem portu. Lub, jeśli lpszHostAddress parametr ma NULLwartość , gniazdo jest skonfigurowane do emisji. Ogólnie rzecz biorąc, datagram emisji nie może przekraczać rozmiaru fragmentacji, co oznacza, że część danych datagramu (z wyłączeniem nagłówków) nie powinna przekraczać 512 bajtów.

Aby obsłużyć adresy IPv6, użyj polecenia CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Wywołaj tę funkcję składową, aby wysyłać dane do określonego miejsca docelowego (obsługuje adresy IPv6).

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

Parametry

lpBuf
Bufor zawierający dane, które mają być przesyłane.

nBufLen
Długość danych w lpBuf bajtach.

nHostPort
Port identyfikujący aplikację gniazda.

lpszHostAddress
Adres sieciowy gniazda, z którym jest połączony ten obiekt: nazwa maszyny, taka jak "ftp.microsoft.com" lub kropkowana liczba, taka jak "128.56.22.8".

nFlags
Określa sposób, w jaki jest wykonywane wywołanie. Semantyka tej funkcji jest określana przez opcje gniazda i nFlags parametr. Ten ostatni jest skonstruowany przez połączenie dowolnej z następujących wartości z operatorem bitowym OR języka C++ (|):

  • MSG_DONTROUTE Określa, że dane nie powinny podlegać routingowi. Dostawca windows Sockets może wybrać, aby zignorować tę flagę.

  • MSG_OOB Wysyłaj dane poza pasmem (SOCK_STREAM tylko).

Wartość zwracana

Jeśli żaden błąd nie wystąpi, SendToEx zwraca łączną liczbę wysłanych znaków. (Należy pamiętać, że może to być mniejsza niż liczba wskazana przez nBufLen. W przeciwnym razie zwracana jest wartość SOCKET_ERROR i można pobrać określony kod błędu, wywołując metodę GetLastError. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEACCES Żądany adres jest adresem emisji, ale nie ustawiono odpowiedniej flagi.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEFAULT Parametry lpBuf lub lpSockAddr nie są częścią przestrzeni adresowej użytkownika lub lpSockAddr argument jest zbyt mały (mniejszy niż rozmiar SOCKADDR struktury).

  • WSAEINVAL Nazwa hosta jest nieprawidłowa.

  • WSAENETRESET Połączenie musi zostać zresetowane, ponieważ implementacja gniazd systemu Windows została porzucona.

  • WSAENOBUFS Implementacja gniazd systemu Windows zgłasza zakleszczenie buforu.

  • WSAENOTCONN Gniazdo nie jest połączone (SOCK_STREAM tylko).

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

  • WSAEOPNOTSUPPMSG_OOB został określony, ale gniazdo nie jest typu SOCK_STREAM.

  • WSAESHUTDOWN Gniazdo zostało zamknięte; nie można wywołać SendToEx gniazda po ShutDown wywołaniu z ustawionym nHow na 1 lub 2.

  • WSAEWOULDBLOCK Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.

  • WSAEMSGSIZE Gniazdo jest typu SOCK_DGRAM, a datagram jest większy niż maksymalna obsługiwana przez implementację gniazd systemu Windows.

  • WSAECONNABORTED Obwód wirtualny został przerwany z powodu przekroczenia limitu czasu lub innej awarii.

  • WSAECONNRESET Obwód wirtualny został zresetowany po stronie zdalnej.

  • WSAEADDRNOTAVAIL Określony adres nie jest dostępny z komputera lokalnego.

  • WSAEAFNOSUPPORT Adresy w określonej rodzinie nie mogą być używane z tym gniazdem.

  • WSAEDESTADDRREQ Adres docelowy jest wymagany.

  • WSAENETUNREACH Obecnie nie można uzyskać dostępu do sieci z tego hosta.

Uwagi

Ta metoda jest taka sama jak CAsyncSocket::SendTo ta, z tą różnicą, że obsługuje adresy IPv6, a także starsze protokoły.

SendToEx jest używany na datagramie lub gniazdach strumienia i służy do zapisywania danych wychodzących na gniazdach. W przypadku gniazd datagramu należy zachować ostrożność, aby nie przekraczać maksymalnego rozmiaru pakietów IP bazowych podsieci, które są podane przez iMaxUdpDg element w WSADATA strukturze wypełnionej przez AfxSocketInit. Jeśli dane są zbyt długie, aby przekazywać niepodzielne dane za pośrednictwem protokołu bazowego, zwracany jest błąd WSAEMSGSIZE i nie są przesyłane żadne dane.

Należy pamiętać, że pomyślne ukończenie obiektu SendToEx nie wskazuje, że dane zostały pomyślnie dostarczone.

SendToEx jest używany tylko na SOCK_DGRAM gniazdach do wysyłania datagramu do określonego gniazda zidentyfikowanego przez lpSockAddr parametr .

Aby wysłać emisję (tylko), adres w parametrze SOCK_DGRAM lpSockAddr powinien być skonstruowany przy użyciu specjalnego adresu INADDR_BROADCAST IP (zdefiniowanego w pliku WINSOCK.Hnagłówka Windows Sockets) wraz z zamierzonym numerem portu. Lub, jeśli lpszHostAddress parametr ma NULLwartość , gniazdo jest skonfigurowane do emisji. Ogólnie rzecz biorąc, datagram emisji nie może przekraczać rozmiaru fragmentacji, co oznacza, że część danych datagramu (z wyłączeniem nagłówków) nie powinna przekraczać 512 bajtów.

CAsyncSocket::SetSockOpt

Wywołaj tę funkcję składową, aby ustawić opcję gniazda.

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

Parametry

nOptionName
Opcja gniazda, dla której ma zostać ustawiona wartość.

lpOptionValue
Wskaźnik do buforu, w którym jest podana wartość żądanej opcji.

nOptionLen
Rozmiar buforu lpOptionValue w bajtach.

nLevel
Poziom, na którym zdefiniowano opcję; jedynymi obsługiwanymi poziomami są SOL_SOCKET i IPPROTO_TCP.

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEFAULTlpOptionValue nie znajduje się w prawidłowej części przestrzeni adresowej procesu.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAEINVALnLevel jest nieprawidłowa lub informacje w pliku lpOptionValue są nieprawidłowe.

  • WSAENETRESET Po ustawieniu limitu czasu połączenia upłynął SO_KEEPALIVE limit czasu.

  • WSAENOPROTOOPT Opcja jest nieznana lub nieobsługiwana. W szczególności SO_BROADCAST nie jest obsługiwane w gniazdach typu SOCK_STREAM, podczas gdy SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERi SO_OOBINLINE nie są obsługiwane w gniazdach typu SOCK_DGRAM.

  • WSAENOTCONN Połączenie zostało zresetowane po SO_KEEPALIVE ustawieniu.

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

SetSockOpt Ustawia bieżącą wartość opcji gniazda skojarzonej z gniazdem dowolnego typu w dowolnym stanie. Mimo że opcje mogą istnieć na wielu poziomach protokołu, ta specyfikacja definiuje tylko opcje, które istnieją na najwyższym poziomie "gniazda". Opcje wpływają na operacje gniazd, takie jak to, czy przyspieszone dane są odbierane w normalnym strumieniu danych, czy można wysyłać komunikaty rozgłaszane w gniazdach itd.

Istnieją dwa typy opcji gniazd: opcje logiczne, które włączają lub wyłączają funkcję lub zachowanie, oraz opcje, które wymagają wartości całkowitej lub struktury. Aby włączyć opcję logiczną, lpOptionValue wskazuje liczbę całkowitą niezerową. Aby wyłączyć opcję lpOptionValue wskazuje liczbę całkowitą równą zero. nOptionLen wartość powinna być równa sizeof(BOOL) dla opcji logicznych. W przypadku innych opcji lpOptionValue wskazuje liczbę całkowitą lub strukturę zawierającą żądaną wartość opcji i nOptionLen jest długością liczby całkowitej lub struktury.

SO_LINGER steruje akcją wykonywaną, gdy dane nie są przechowywane w kolejce do gniazda, a Close funkcja jest wywoływana w celu zamknięcia gniazda.

Domyślnie gniazdo nie może być powiązane (patrz Bind) z adresem lokalnym, który jest już używany. Czasami jednak pożądane może być "ponowne użycie" adresu w ten sposób. Ponieważ każde połączenie jest jednoznacznie identyfikowane przez kombinację adresów lokalnych i zdalnych, nie ma problemu z posiadaniem dwóch gniazd powiązanych z tym samym adresem lokalnym, o ile adresy zdalne są różne.

Aby poinformować implementację gniazd systemu Windows, że Bind wywołanie gniazda nie powinno być niedozwolone, ponieważ żądany adres jest już używany przez inne gniazdo, aplikacja powinna ustawić SO_REUSEADDR opcję gniazda dla gniazda przed wysłaniem Bind wywołania. Należy pamiętać, że opcja jest interpretowana tylko w momencie Bind wywołania: dlatego niepotrzebne (ale nieszkodliwe) ustawienie opcji na gniazda, które nie ma być powiązane z istniejącym adresem, i ustawienie lub zresetowanie opcji po Bind wywołaniu nie ma wpływu na to lub inne gniazdo.

Aplikacja może zażądać, aby implementacja gniazd systemu Windows umożliwiała korzystanie z pakietów "keep-alive" w połączeniach protokołu Transmission Control Protocol (TCP), włączając SO_KEEPALIVE opcję gniazda. Implementacja gniazd systemu Windows nie musi obsługiwać używania funkcji keep-alive: jeśli tak, dokładna semantyka jest specyficzna dla implementacji, ale powinna być zgodna z sekcją 4.2.3.6 RFC 1122: "Wymagania dotyczące hostów internetowych — warstwy komunikacji". Jeśli połączenie zostanie porzucone w wyniku "keep-alives", kod WSAENETRESET błędu zostanie zwrócony do wszystkich wywołań w toku w gniazdie, a wszystkie kolejne wywołania nie powiedzą się z WSAENOTCONN.

Opcja TCP_NODELAY wyłącza algorytm Nagle. Algorytm Nagle służy do zmniejszenia liczby małych pakietów wysyłanych przez hosta przez buforowanie niezaznaczonych danych wysyłanych do momentu wysłania pełnego pakietu. Jednak w przypadku niektórych aplikacji ten algorytm może utrudniać wydajność i TCP_NODELAY można go wyłączyć. Autorzy aplikacji nie powinni ustawiać TCP_NODELAY , chyba że wpływ tego działania jest dobrze zrozumiały i pożądany, ponieważ ustawienie TCP_NODELAY może mieć znaczący negatywny wpływ na wydajność sieci. TCP_NODELAY jest jedyną obsługiwaną opcją gniazda, która używa poziomu IPPROTO_TCP; wszystkie inne opcje używają poziomu SOL_SOCKET.

Niektóre implementacje gniazd systemu Windows dostarczają informacje o debugowaniu danych wyjściowych, jeśli SO_DEBUG opcja jest ustawiona przez aplikację.

Następujące opcje są obsługiwane dla programu SetSockOpt. Typ identyfikuje typ danych adresowanych przez lpOptionValueelement .

Wartość Typ Znaczenie
SO_BROADCAST BOOL Zezwalaj na transmisję komunikatów rozgłaszanych w gniazdach.
SO_DEBUG BOOL Rejestruj informacje o debugowaniu.
SO_DONTLINGER BOOL Nie blokuj Close oczekiwania na wysłanie nieumyślnych danych. Ustawienie tej opcji jest równoważne ustawieniu SO_LINGER z ustawieniem l_onoff ustawionym na zero.
SO_DONTROUTE BOOL Nie należy kierować: wysyłaj bezpośrednio do interfejsu.
SO_KEEPALIVE BOOL Wysyłaj żywców.
SO_LINGER struct LINGER Utrzymaj się, Close jeśli nie są obecne dane.
SO_OOBINLINE BOOL Odbieranie danych poza pasmem w normalnym strumieniu danych.
SO_RCVBUF int Określ rozmiar buforu dla odbioru.
SO_REUSEADDR BOOL Zezwalaj na powiązanie gniazda z adresem, który jest już używany. (Zobacz Wiązanie.
SO_SNDBUF int Określ rozmiar buforu dla wysyłania.
TCP_NODELAY BOOL Wyłącza algorytm Nagle na potrzeby łączenia.

Opcje dystrybucji oprogramowania Berkeley (BSD) nie są obsługiwane w następujących celach SetSockOpt :

Wartość Typ Znaczenie
SO_ACCEPTCONN BOOL Gniazdo nasłuchuje
SO_ERROR int Uzyskaj stan błędu i wyczyść go.
SO_RCVLOWAT int Odbierz niski znak wody.
SO_RCVTIMEO int Limit czasu odbierania
SO_SNDLOWAT int Wyślij niski znacznik wody.
SO_SNDTIMEO int Limit czasu wysyłania.
SO_TYPE int Typ gniazda.
IP_OPTIONS Ustaw pole opcji w nagłówku adresu IP.

CAsyncSocket::ShutDown

Wywołaj tę funkcję składową, aby wyłączyć wysyłanie, odbieranie lub oba te elementy na gniazdach.

BOOL ShutDown(int nHow = sends);

Parametry

nHow
Flaga opisując, jakie typy operacji nie będą już dozwolone, używając następujących wyliczonych wartości:

  • odbiera = 0

  • sends = 1

  • oba = 2

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. Następujące błędy dotyczą tej funkcji składowej:

  • WSANOTINITIALISED Przed użyciem tego interfejsu API musi nastąpić pomyślne AfxSocketInit wystąpienie.

  • WSAENETDOWN Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.

  • WSAEINVALnHow jest nieprawidłowy.

  • WSAEINPROGRESS Trwa blokowanie operacji Windows Sockets.

  • WSAENOTCONN Gniazdo nie jest połączone (SOCK_STREAM tylko).

  • WSAENOTSOCK Deskryptor nie jest gniazdem.

Uwagi

ShutDown jest używany we wszystkich typach gniazd do wyłączania odbioru, transmisji lub obu. Jeśli nHow wartość to 0, kolejne odbiory na gniazdo zostaną niedozwolone. Nie ma to wpływu na niższe warstwy protokołu.

W przypadku protokołu TCP (Transmission Control Protocol) okno TCP nie zostanie zmienione, a dane przychodzące zostaną zaakceptowane (ale nie zostaną potwierdzone), dopóki okno nie zostanie wyczerpane. W przypadku protokołu UDP (User Datagram Protocol) przychodzące datagramy są akceptowane i kolejkowane. W żadnym przypadku zostanie wygenerowany pakiet błędu ICMP. Jeśli nHow wartość to 1, kolejne wysyłanie jest niedozwolone. W przypadku gniazd TCP zostanie wysłany fin. Ustawienie nHow na 2 powoduje wyłączenie zarówno wysyłania, jak i odbierania zgodnie z powyższym opisem.

Należy pamiętać, że ShutDown nie zamyka gniazda, a zasoby dołączone do gniazda nie zostaną uwolnione do momentu Close wywołania. Aplikacja nie powinna polegać na możliwości ponownego użycia gniazda po jego zamknięciu. W szczególności implementacja gniazd systemu Windows nie jest wymagana do obsługi użycia Connect w takim gniazdach.

Przykład

Zobacz przykład dla elementu CAsyncSocket::OnReceive.

CASyncSocket::Socket

Przydziela uchwyt gniazda.

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

Parametry

nSocketType
Określa SOCK_STREAM lub SOCK_DGRAM.

lEvent
Maska bitowa określająca kombinację zdarzeń sieciowych, w których interesuje się aplikacja.

  • FD_READ: Chcesz otrzymywać powiadomienia o gotowości do czytania.

  • FD_WRITE: Chcesz otrzymywać powiadomienia o gotowości do zapisu.

  • FD_OOB: Chcesz otrzymywać powiadomienie o nadejściu danych poza pasmem.

  • FD_ACCEPT: Chcesz otrzymywać powiadomienia o połączeniach przychodzących.

  • FD_CONNECT: Chcesz otrzymywać powiadomienie o ukończonym połączeniu.

  • FD_CLOSE: Chcesz otrzymywać powiadomienie o zamknięciu gniazda.

nProtocolType
Protokół używany z gniazdem specyficznym dla wskazanej rodziny adresów.

nAddressFormat
Specyfikacja rodziny adresów.

Wartość zwracana

Zwraca powodzenie TRUE po FALSE niepowodzeniu.

Uwagi

Ta metoda przydziela uchwyt gniazda. Nie wywołuje CAsyncSocket::Bind wywołania powiązania gniazda z określonym adresem, dlatego należy wywołać Bind je później, aby powiązać gniazdo z określonym adresem. Możesz użyć CAsyncSocket::SetSockOpt polecenia , aby ustawić opcję gniazda przed jej powiązaniem.

Zobacz też

CObject Klasa
Wykres hierarchii
CSocket Klasa
CSocketFile Klasa