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
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
jest za mały (mniejszy niż rozmiarSOCKADDR
struktury).WSAEINPROGRESS
Trwa blokowanie wywołania gniazd systemu Windows.WSAEINVAL
Listen
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 rConnectedSocket
elementu . 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ślneAfxSocketInit
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEADDRINUSE
Określony adres jest już używany. (ZobaczSO_REUSEADDR
opcję gniazda w obszarzeSetSockOpt
.)WSAEFAULT
ArgumentnSockAddrLen
jest za mały (mniejszy niż rozmiarSOCKADDR
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 CAsyncSocket
programu , ale nie dla CSocket
programu , semantyka elementu Close
ma wpływ na opcje SO_LINGER
gniazd i SO_DONTLINGER
. Aby uzyskać więcej informacji, zobacz funkcja GetSockOpt
skł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ślneAfxSocketInit
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
ArgumentnSockAddrLen
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ślneAfxSocketInit
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, pustegoCSocket
obiektu jako parametru. Przed wywołaniemAccept
metody należy skonstruować ten obiekt . Należy pamiętać, że jeśli ten obiekt gniazda wykracza poza zakres, połączenie zostanie zamknięte. Nie należy wywoływaćCreate
tego nowego obiektu gniazda.
Ważne
Create
nie 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 hSocket
elementu .
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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 adresieBind
.
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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 adresieBind
.
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_LINGER
parametru 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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpOptionLen
był nieprawidłowy.WSAEINPROGRESS
Trwa blokowanie operacji Windows Sockets.WSAENOPROTOOPT
Opcja jest nieznana lub nieobsługiwana. W szczególnościSO_BROADCAST
nie jest obsługiwane w gniazdach typuSOCK_STREAM
, podczas gdySO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
iSO_OOBINLINE
nie są obsługiwane w gniazdach typuSOCK_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 lpOptionValue
element . 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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEINVAL
lCommand
nie jest prawidłowym poleceniem lublpArgument
nie jest dopuszczalnym parametrem dlalCommand
, 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. ParametrlpArgument
wskazuje wartośćDWORD
, która jest niezerowa, jeśli tryb bezblokowania ma być włączony i zero, jeśli ma zostać wyłączony. JeśliAsyncSelect
zostało wystawione na gniazdo, każda próba użyciaIOCtl
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 zapobiecWSAEINVAL
błędowi, aplikacja musi najpierw wyłączyćAsyncSelect
wywołanieAsyncSelect
parametrulEvent
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ą jednegoReceive
wywołania z tego gniazda. ParametrlpArgument
wskazuje,DWORD
w którymIOCtl
przechowuje wynik. Jeśli to gniazdo jest typuSOCK_STREAM
,FIONREAD
zwraca łączną ilość danych, które można odczytać w jednym miejscuReceive
; jest to zwykle takie samo, jak łączna ilość danych w kolejce do gniazda. Jeśli to gniazdo jest typuSOCK_DGRAM
,FIONREAD
zwraca rozmiar pierwszego datagramu w kolejce do gniazda.SIOCATMARK
Ustal, czy wszystkie dane poza pasmem zostały odczytane. Dotyczy to tylko gniazda typuSOCK_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ępneReceive
lubReceiveFrom
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 lubReceiveFrom
nigdy nie będzie mieszać poza pasmemReceive
i normalnych danych w tym samym wywołaniu). ParametrlpArgument
wskazuje,DWORD
w którymIOCtl
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 FIOASYNC
funkcji , 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ślneAfxSocketInit
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 zBind
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ą Create
polecenia , listę prac dla połączeń przychodzących jest określona za pomocą Listen
polecenia , a następnie połączenia są akceptowane za pomocą Accept
polecenia . 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
ArgumentlpSockAddrLen
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 CSocket
systemie 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ślneAfxSocketInit
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.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćReceive
gniazda poShutDown
wywołaniu z ustawionymnHow
na 0 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, aReceive
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 elementemBind
.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_STREAM
zwracana 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_OOBINLINE
gniazda ) 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 WSAEMSGSIZE
wartość . Jeśli w gniazdie nie są dostępne żadne dane przychodzące, zostanie zwrócona wartość SOCKET_ERROR
z kodem błędu ustawionym na WSAEWOULDBLOCK
wartość . 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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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 elementemBind
.WSAENOTCONN
Gniazdo nie jest połączone (SOCK_STREAM
tylko).WSAENOTSOCK
Deskryptor nie jest gniazdem.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćReceiveFrom
gniazda poShutDown
wywołaniu z ustawionymnHow
na 0 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, aReceiveFrom
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_STREAM
zwracana 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_OOBINLINE
gniazda ) 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 WSAEMSGSIZE
wartość .
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 WSAEWOULDBLOCK
wartość . 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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
ArgumentlpSockAddrLen
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 elementemBind
.WSAENOTCONN
Gniazdo nie jest połączone (SOCK_STREAM
tylko).WSAENOTSOCK
Deskryptor nie jest gniazdem.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćReceiveFromEx
gniazda poShutDown
wywołaniu z ustawionymnHow
na 0 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, aReceiveFromEx
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_STREAM
zwracana 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_OOBINLINE
gniazda ) 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 WSAEMSGSIZE
wartość .
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 WSAEWOULDBLOCK
wartość . 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ślneAfxSocketInit
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
ArgumentlpBuf
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.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćSend
gniazda poShutDown
wywołaniu z ustawionymnHow
na 1 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.WSAEMSGSIZE
Gniazdo jest typuSOCK_DGRAM
, a datagram jest większy niż maksymalna obsługiwana przez implementację gniazd systemu Windows.WSAEINVAL
Gniazdo nie zostało powiązane z elementemBind
.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 GetLastError
metody 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_STREAM
liczba 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ślneAfxSocketInit
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
ParametrylpBuf
lublpSockAddr
nie są częścią przestrzeni adresowej użytkownika lublpSockAddr
argument jest zbyt mały (mniejszy niż rozmiarSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćSendTo
gniazda poShutDown
wywołaniu z ustawionymnHow
na 1 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.WSAEMSGSIZE
Gniazdo jest typuSOCK_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.H
nagłówka Windows Sockets) wraz z zamierzonym numerem portu. Lub, jeśli lpszHostAddress
parametr ma NULL
wartość , 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ślneAfxSocketInit
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
ParametrylpBuf
lublpSockAddr
nie są częścią przestrzeni adresowej użytkownika lublpSockAddr
argument jest zbyt mały (mniejszy niż rozmiarSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
został określony, ale gniazdo nie jest typuSOCK_STREAM
.WSAESHUTDOWN
Gniazdo zostało zamknięte; nie można wywołaćSendToEx
gniazda poShutDown
wywołaniu z ustawionymnHow
na 1 lub 2.WSAEWOULDBLOCK
Gniazdo jest oznaczone jako nieblokujące, a żądana operacja zostanie zablokowana.WSAEMSGSIZE
Gniazdo jest typuSOCK_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.H
nagłówka Windows Sockets) wraz z zamierzonym numerem portu. Lub, jeśli lpszHostAddress
parametr ma NULL
wartość , 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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEFAULT
lpOptionValue
nie znajduje się w prawidłowej części przestrzeni adresowej procesu.WSAEINPROGRESS
Trwa blokowanie operacji Windows Sockets.WSAEINVAL
nLevel
jest nieprawidłowa lub informacje w plikulpOptionValue
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ściSO_BROADCAST
nie jest obsługiwane w gniazdach typuSOCK_STREAM
, podczas gdySO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
iSO_OOBINLINE
nie są obsługiwane w gniazdach typuSOCK_DGRAM
.WSAENOTCONN
Połączenie zostało zresetowane poSO_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 lpOptionValue
element .
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ślneAfxSocketInit
wystąpienie.WSAENETDOWN
Implementacja gniazd systemu Windows wykryła, że podsystem sieciowy zakończył się niepowodzeniem.WSAEINVAL
nHow
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