Sdílet prostřednictvím


CAsyncSocket Třída

Představuje rozhraní Windows Socket – koncový bod síťové komunikace.

Syntaxe

class CAsyncSocket : public CObject

Členové

Veřejné konstruktory

Název Popis
CAsyncSocket::CAsyncSocket CAsyncSocket Vytvoří objekt.

Veřejné metody

Název Popis
CAsyncSocket::Accept Přijímá připojení na soketu.
CAsyncSocket::AsyncSelect Vyžádá si oznámení o události pro soket.
CAsyncSocket::Attach Připojí úchyt soketu k objektu CAsyncSocket .
CAsyncSocket::Bind Přidruží místní adresu k soketu.
CAsyncSocket::Close Zavře soket.
CAsyncSocket::Connect Vytvoří připojení k partnerskému soketu.
CAsyncSocket::Create Vytvoří soket.
CAsyncSocket::CreateEx Vytvoří soket s pokročilými možnostmi.
CAsyncSocket::Detach Odpojte úchyt soketu od objektu CAsyncSocket .
CAsyncSocket::FromHandle Vrátí ukazatel na CAsyncSocket objekt vzhledem k úchytu soketu.
CAsyncSocket::GetLastError Získá stav chyby poslední operace, která selhala.
CAsyncSocket::GetPeerName Získá adresu partnerského soketu, ke kterému je soket připojen.
CAsyncSocket::GetPeerNameEx Získá adresu partnerského soketu, ke kterému je soket připojený (zpracovává adresy IPv6).
CAsyncSocket::GetSockName Získá místní název soketu.
CAsyncSocket::GetSockNameEx Získá místní název soketu (zpracovává adresy IPv6).
CAsyncSocket::GetSockOpt Načte možnost soketu.
CAsyncSocket::IOCtl Řídí režim soketu.
CAsyncSocket::Listen Vytvoří soket pro naslouchání příchozím požadavkům připojení.
CAsyncSocket::Receive Přijímá data ze soketu.
CAsyncSocket::ReceiveFrom Přijme datagram a uloží zdrojovou adresu.
CAsyncSocket::ReceiveFromEx Přijme datagram a uloží zdrojovou adresu (zpracovává adresy IPv6).
CAsyncSocket::Send Odesílá data do připojeného soketu.
CAsyncSocket::SendTo Odesílá data do konkrétního cíle.
CAsyncSocket::SendToEx Odesílá data do konkrétního cíle (zpracovává adresy IPv6).
CAsyncSocket::SetSockOpt Nastaví možnost soketu.
CAsyncSocket::ShutDown Send Zakáže nebo Receive volá soket.
CASyncSocket::Socket Přidělí popisovač soketu.

Chráněné metody

Název Popis
CAsyncSocket::OnAccept Upozorní naslouchací soket, že může přijímat čekající žádosti o připojení voláním Accept.
CAsyncSocket::OnClose Upozorní soket, že se zásuvka připojená k ní zavřela.
CAsyncSocket::OnConnect Upozorní spojovací soket, že je pokus o připojení dokončen, ať už se úspěšně nebo omylem.
CAsyncSocket::OnOutOfBandData Upozorní přijímající soket, že v soketu se dají číst nesčetná data, obvykle se jedná o urgentní zprávu.
CAsyncSocket::OnReceive Upozorní naslouchací soket, že existují data, která se mají načíst voláním Receive.
CAsyncSocket::OnSend Upozorní soket, že může odesílat data voláním Send.

Veřejné operátory

Název Popis
CAsyncSocket::operator = Přiřadí objektu novou hodnotu CAsyncSocket .
CAsyncSocket::operator SOCKET Tento operátor slouží k načtení SOCKET popisovače objektu CAsyncSocket .

Veřejné datové členy

Název Popis
CAsyncSocket::m_hSocket Označuje popisovač připojený k tomuto CAsyncSocket objektuSOCKET.

Poznámky

Třída CAsyncSocket zapouzdřuje rozhraní API windows Socket Functions a poskytuje objektově orientované abstrakci pro programátory, kteří chtějí používat rozhraní Windows Sockets ve spojení s MFC.

Tato třída vychází z předpokladu, že rozumíte síťové komunikaci. Zodpovídáte za blokování, rozdíly v bajtech a převody mezi řetězci unicode a vícebajtové znakové sady (MBCS). Pokud chcete pohodlnější rozhraní, které tyto problémy spravuje za vás, podívejte se na třídu CSocket.

Chcete-li použít CAsyncSocket objekt, zavolejte jeho konstruktor a potom zavolejte Create funkci k vytvoření podkladového popisovače soketu (typ SOCKET), s výjimkou akceptovaných soketů. Pro volání členské funkce soketu Listen serveru a pro klientské soket volání Connect členské funkce. Serverový soket by měl funkci volat Accept při přijetí žádosti o připojení. Pomocí zbývajících CAsyncSocket funkcí můžete provádět komunikaci mezi sokety. Po dokončení odstraňte CAsyncSocket objekt, pokud byl vytvořen v haldě; destruktor automaticky volá Close funkci. Datový SOCKET typ je popsán v článku Windows Sockets: Background.

Poznámka:

Při použití soketů MFC v sekundárních vláknech v staticky propojené aplikaci MFC je nutné volat AfxSocketInit v každém vlákně, které používá sokety k inicializaci knihoven soketů. Ve výchozím nastavení AfxSocketInit se volá pouze v primárním vlákně.

Další informace naleznete v tématu Windows Sockets: Použití třídy CAsyncSocket a souvisejících článků., stejně jako rozhraní API rozhraní Windows Sockets 2.

Hierarchie dědičnosti

CObject

CAsyncSocket

Požadavky

Záhlaví: afxsock.h

CAsyncSocket::Accept

Voláním této členské funkce přijmete připojení na soketu.

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

Parametry

rConnectedSocket
Odkaz identifikující nový soket, který je k dispozici pro připojení.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která přijímá adresu spojovacího soketu, jak je známo v síti. Přesný formát argumentu lpSockAddr určuje rodina adres vytvořená při vytvoření soketu. Pokud lpSockAddr a/nebo jsou lpSockAddrLen rovny NULL, pak se nevrátí žádné informace o vzdálené adrese přijatého soketu.

lpSockAddrLen
Ukazatel na délku adresy v lpSockAddr bajtech. Jedná se lpSockAddrLen o parametr výsledku hodnoty: měl by zpočátku obsahovat množství místa, na které lpSockAddrodkazuje ; při vrácení bude obsahovat skutečnou délku (v bajtech) vrácené adresy.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen je příliš malý (menší než velikost SOCKADDR struktury).

  • WSAEINPROGRESS Probíhá blokující volání rozhraní Windows Sockets.

  • WSAEINVALListen nebyl vyvolán před přijetím.

  • WSAEMFILE Fronta je po přijetí prázdná a nejsou k dispozici žádné popisovače.

  • WSAENOBUFS Není k dispozici žádný prostor vyrovnávací paměti.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPP Odkazovaný soket není typem, který podporuje službu zaměřenou na připojení.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a nejsou k dispozici žádná připojení.

Poznámky

Tato rutina extrahuje první připojení ve frontě čekajících připojení, vytvoří nový soket se stejnými vlastnostmi jako tento soket a připojí ho k rConnectedSocket. Pokud ve frontě nejsou žádná čekající připojení, Accept vrátí nulu a GetLastError vrátí chybu. Akceptované sokety (rConnectedSocket) nelze použít k přijetí dalších připojení. Původní soket zůstane otevřený a naslouchá.

lpSockAddr Argument je výsledný parametr, který je vyplněný adresou spojovacího soketu, jak se označuje jako komunikační vrstva. Accept se používá s typy soketů založenými na připojení, jako SOCK_STREAMje .

CAsyncSocket::AsyncSelect

Voláním této členské funkce požádejte o oznámení události pro soket.

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

Parametry

lEvent
Bitová maska, která určuje kombinaci síťových událostí, ve kterých se aplikace zajímá.

  • FD_READ Chcete dostávat oznámení o připravenosti ke čtení.

  • FD_WRITE Chcete dostávat oznámení, když jsou data k dispozici ke čtení.

  • FD_OOB Chcete dostávat oznámení o přijetí odchozích dat.

  • FD_ACCEPT Chcete dostávat oznámení o příchozích připojeních.

  • FD_CONNECT Chcete dostávat oznámení o výsledcích připojení.

  • FD_CLOSE Chcete dostávat oznámení, když partner zavře soket.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEINVAL Označuje, že jeden ze zadaných parametrů byl neplatný.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

Poznámky

Tato funkce slouží k určení, které funkce oznámení zpětného volání MFC budou volána pro soket. AsyncSelect automaticky nastaví tento soket do režimu odblokování. Další informace najdete v článku Windows Sockets: Socket Notifications.

CAsyncSocket::Attach

Voláním této členské funkce připojíte hSocket popisovač k objektu CAsyncSocket .

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

Parametry

hSocket
Obsahuje popisovač soketu.

lEvent
Bitová maska, která určuje kombinaci síťových událostí, ve kterých se aplikace zajímá.

  • FD_READ Chcete dostávat oznámení o připravenosti ke čtení.

  • FD_WRITE Chcete dostávat oznámení, když jsou data k dispozici ke čtení.

  • FD_OOB Chcete dostávat oznámení o přijetí odchozích dat.

  • FD_ACCEPT Chcete dostávat oznámení o příchozích připojeních.

  • FD_CONNECT Chcete dostávat oznámení o výsledcích připojení.

  • FD_CLOSE Chcete dostávat oznámení, když partner zavře soket.

Návratová hodnota

Nenulové, pokud je funkce úspěšná.

Poznámky

Popisovač SOCKET je uložen v datovém členu objektu m_hSocket .

CAsyncSocket::Bind

Voláním této členské funkce přidružíte k soketu místní adresu.

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

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

Parametry

nSocketPort
Port identifikující aplikaci soketu.

lpszSocketAddress
Síťová adresa, tečkované číslo, například 128.56.22.8. NULL Předání řetězce pro tento parametr indikuje, že CAsyncSocket instance by měla naslouchat aktivitě klienta ve všech síťových rozhraních.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která obsahuje adresu pro přiřazení k tomuto soketu.

nSockAddrLen
Délka adresy vbajch lpSockAddr

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující seznam obsahuje několik chyb, které mohou být vráceny. Úplný seznam naleznete v tématu Kódy chyb rozhraní Windows Sockets.

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEADDRINUSE Zadaná adresa se už používá. (Viz možnost soketu SO_REUSEADDR v části SetSockOpt.)

  • WSAEFAULT Argument nSockAddrLen je příliš malý (menší než velikost SOCKADDR struktury).

  • WSAEINPROGRESS Probíhá blokující volání rozhraní Windows Sockets.

  • WSAEAFNOSUPPORT Tento port nepodporuje zadanou řadu adres.

  • WSAEINVAL Soket je již vázán na adresu.

  • WSAENOBUFS Není k dispozici dostatek vyrovnávacích pamětí, příliš mnoho připojení.

  • WSAENOTSOCK Popisovač není soket.

Poznámky

Tato rutina se používá u nepřipojeného datagramu nebo soketu streamu před následnými Connect voláními nebo Listen voláními. Aby mohl přijímat požadavky na připojení, musí naslouchací serverový soket vybrat číslo portu a volat windows Sockets Bind. Bind vytvoří místní přidružení (adresa hostitele nebo číslo portu) soketu přiřazením místního názvu k nepojmenovanému soketu.

CAsyncSocket::CAsyncSocket

Vytvoří prázdný objekt soketu.

CAsyncSocket();

Poznámky

Po vytvoření objektu je nutné zavolat jeho Create člen funkce vytvořit SOCKET datovou strukturu a vytvořit vazbu její adresy. (Na straně serveru komunikace windows Sockets, když naslouchácí soket vytvoří soket, který se použije při Accept volání, nebudete volat Create pro tento soket.)

CAsyncSocket::Close

Zavře soket.

virtual void Close();

Poznámky

Tato funkce uvolní popisovač soketu tak, aby další odkazy na ni selhaly s chybou WSAENOTSOCK. Pokud se jedná o poslední odkaz na podkladový soket, přidružené informace o pojmenování a data ve frontě se zahodí. Destruktor objektu soketu za vás volá Close .

Pro , ale ne pro CSocketCAsyncSocket, sémantika Close jsou ovlivněny možnostmi SO_LINGER soketu a SO_DONTLINGER. Další informace naleznete v tématu členské funkce GetSockOpt.

CAsyncSocket::Connect

Voláním této členské funkce navážete připojení k nepřipojené datovému proudu nebo soketu datagramu.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

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

Parametry

lpszHostAddress
Síťová adresa soketu, ke kterému je tento objekt připojený: název počítače, například "ftp.microsoft.com", nebo tečkované číslo, například "128.56.22.8".

nHostPort
Port identifikující aplikaci soketu.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která obsahuje adresu připojeného soketu.

nSockAddrLen
Délka adresy vbajch lpSockAddr

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Pokud to značí kód WSAEWOULDBLOCKchyby a vaše aplikace používá přepisovatelné zpětné volání, aplikace obdrží OnConnect po dokončení operace připojení zprávu. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEADDRINUSE Zadaná adresa se už používá.

  • WSAEINPROGRESS Probíhá blokující volání rozhraní Windows Sockets.

  • WSAEADDRNOTAVAIL Zadaná adresa není k dispozici na místním počítači.

  • WSAEAFNOSUPPORT Adresy v zadané rodině nelze s tímto soketem použít.

  • WSAECONNREFUSED Pokus o připojení byl odmítnut.

  • WSAEDESTADDRREQ Je vyžadována cílová adresa.

  • WSAEFAULT Argument nSockAddrLen je nesprávný.

  • WSAEINVAL Neplatná adresa hostitele

  • WSAEISCONN Soket je již připojen.

  • WSAEMFILE Nejsou k dispozici žádné další popisovače souborů.

  • WSAENETUNREACH Síť nelze v tuto chvíli získat z tohoto hostitele.

  • WSAENOBUFS Není k dispozici žádný prostor vyrovnávací paměti. Soket nelze připojit.

  • WSAENOTSOCK Popisovač není soket.

  • WSAETIMEDOUT Došlo k vypršení časového limitu připojení bez navázání připojení.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a připojení nelze dokončit okamžitě.

Poznámky

Pokud je soket nevázaný, přiřadí se systému jedinečné hodnoty k místnímu přidružení a soket je označen jako svázaný. Všimněte si, že pokud je pole adresy struktury názvů všechny nuly, Connect vrátí nulu. Pokud chcete získat rozšířené informace o chybě, zavolejte členovu GetLastError funkci.

Pro sokety datových proudů (typ SOCK_STREAM) se zahájí aktivní připojení k cizímu hostiteli. Po úspěšném dokončení volání soketu je soket připravený k odesílání a přijímání dat.

Pro soket datagramu (typ SOCK_DGRAM) je nastaven výchozí cíl, který se použije při následných Send voláních a Receive voláních.

CAsyncSocket::Create

Create Volání členské funkce po vytvoření objektu soketu pro vytvoření soketu Systému Windows a jeho připojení.

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
Dobře známý port, který se má použít se soketem, nebo 0, pokud chcete, aby rozhraní Windows Sockets vybrali port.

nSocketType
SOCK_STREAM nebo SOCK_DGRAM.

lEvent
Bitová maska, která určuje kombinaci síťových událostí, ve kterých se aplikace zajímá.

  • FD_READ Chcete dostávat oznámení o připravenosti ke čtení.

  • FD_WRITE Chcete dostávat oznámení o připravenosti na psaní.

  • FD_OOB Chcete dostávat oznámení o přijetí odchozích dat.

  • FD_ACCEPT Chcete dostávat oznámení o příchozích připojeních.

  • FD_CONNECT Chcete dostávat oznámení o dokončených připojeních.

  • FD_CLOSE Chcete dostávat oznámení o uzavření soketu.

lpszSockAddress
Ukazatel na řetězec obsahující síťovou adresu připojeného soketu, tečkované číslo, například 128.56.22.8. NULL Předání řetězce pro tento parametr indikuje, že CAsyncSocket instance by měla naslouchat aktivitě klienta ve všech síťových rozhraních.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEAFNOSUPPORT Zadaná řada adres se nepodporuje.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEMFILE Nejsou k dispozici žádné další popisovače souborů.

  • WSAENOBUFS Není k dispozici žádný prostor vyrovnávací paměti. Soket nelze vytvořit.

  • WSAEPROTONOSUPPORT Zadaný port není podporován.

  • WSAEPROTOTYPE Zadaný port je pro tento soket nesprávný typ.

  • WSAESOCKTNOSUPPORT Zadaný typ soketu není v této rodině adres podporován.

Poznámky

Create volání Socket a v případě úspěchu volání Bind k vytvoření vazby soketu na zadanou adresu. Podporují se následující typy soketů:

  • SOCK_STREAM Poskytuje sekvencované, spolehlivé a plně duplexní datové proudy založené na připojení. Používá protokol TCP (Transmission Control Protocol) pro řadu internetových adres.

  • SOCK_DGRAM Podporuje datagramy, což jsou nespolehlivé pakety s pevnou (obvykle malou) maximální délkou. Používá protokol UDP (User Datagram Protocol) pro řadu internetových adres.

    Poznámka:

    Členová Accept funkce jako parametr přebírá odkaz na nový prázdný CSocket objekt. Tento objekt je nutné sestavit před voláním Accept. Mějte na paměti, že pokud tento objekt soketu přestane být obor, připojení se zavře. Nevolejte Create pro tento nový objekt soketu.

Důležité

Createnení bezpečný pro přístup z více vláken. Pokud ho voláte v prostředí s více vlákny, ve kterém by mohlo být vyvoláno současně různými vlákny, nezapomeňte každé volání chránit pomocí mutex nebo jiného zámku synchronizace.

Další informace o soketech datových proudů a datovýchgramů najdete v článcích Windows Sockets: Background a Windows Sockets: Porty a adresy soketů a rozhraní WINDOWS Sockets 2 API.

CAsyncSocket::CreateEx

CreateEx Volání členské funkce po vytvoření objektu soketu pro vytvoření soketu Systému Windows a jeho připojení.

Tuto funkci použijte, když potřebujete zadat pokročilé možnosti, jako je typ soketu.

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

Parametry

pAI
Ukazatel na informace o soketu ADDRINFOT , jako je řada a typ soketu.

lEvent
Bitová maska, která určuje kombinaci síťových událostí, ve kterých se aplikace zajímá.

  • FD_READ Chcete dostávat oznámení o připravenosti ke čtení.

  • FD_WRITE Chcete dostávat oznámení o připravenosti na psaní.

  • FD_OOB Chcete dostávat oznámení o přijetí odchozích dat.

  • FD_ACCEPT Chcete dostávat oznámení o příchozích připojeních.

  • FD_CONNECT Chcete dostávat oznámení o dokončených připojeních.

  • FD_CLOSE Chcete dostávat oznámení o uzavření soketu.

Návratová hodnota

Podívejte se na návratové hodnoty pro Create().

Poznámky

Viz poznámky pro Create().

CAsyncSocket::Detach

Voláním této členské funkce odpojíte SOCKET popisovač v datovém členu m_hSocket od objektu CAsyncSocket a nastavíte m_hSocket na NULLhodnotu .

SOCKET Detach();

CAsyncSocket::FromHandle

Vrátí ukazatel na CAsyncSocket objekt.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parametry

hSocket
Obsahuje popisovač soketu.

Návratová hodnota

Ukazatel na objekt nebo NULL pokud není k objektu CAsyncSocket připojen hSocketžádný CAsyncSocket objekt .

Poznámky

Při zadání SOCKET popisovače, pokud CAsyncSocket objekt není připojen k popisovači, členské funkce vrátí NULL.

CAsyncSocket::GetLastError

Voláním této členské funkce zobrazíte stav chyby poslední operace, která selhala.

static int PASCAL GetLastError();

Návratová hodnota

Vrácená hodnota označuje kód chyby poslední rutiny rozhraní API rozhraní Windows Sockets prováděné tímto vláknem.

Poznámky

Pokud konkrétní členová funkce indikuje, že došlo k chybě, GetLastError měla by být volána, aby se načetl příslušný kód chyby. Seznam použitelných kódů chyb najdete v popisu jednotlivých členských funkcí.

Další informace o kódech chyb naleznete v tématu Rozhraní API rozhraní Windows Sockets 2.

CAsyncSocket::GetPeerName

Voláním této členské funkce získáte adresu partnerského soketu, ke kterému je tento soket připojený.

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

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

Parametry

rPeerAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rPeerPort
Odkaz na UINT port, který ukládá port.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která přijímá název partnerského soketu.

lpSockAddrLen
Ukazatel na délku adresy v lpSockAddr bajtech. Při vrácení lpSockAddrLen argument obsahuje skutečnou velikost vrácených lpSockAddr v bajtech.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen není dostatečně velký.

  • WSAEINPROGRESS Probíhá blokující volání rozhraní Windows Sockets.

  • WSAENOTCONN Soket není připojen.

  • WSAENOTSOCK Popisovač není soket.

Poznámky

Pro zpracování adres IPv6 použijte CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Voláním této členské funkce získáte adresu partnerského soketu, ke kterému je tento soket připojený (zpracovává adresy IPv6).

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

Parametry

rPeerAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rPeerPort
Odkaz na UINT port, který ukládá port.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen není dostatečně velký.

  • WSAEINPROGRESS Probíhá blokující volání rozhraní Windows Sockets.

  • WSAENOTCONN Soket není připojen.

  • WSAENOTSOCK Popisovač není soket.

Poznámky

Tato funkce je stejná jako ta, která CAsyncSocket::GetPeerName zpracovává adresy IPv6 i starší protokoly.

CAsyncSocket::GetSockName

Voláním této členské funkce získáte místní název soketu.

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

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

Parametry

rSocketAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rSocketPort
Odkaz na UINT port, který ukládá port.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která přijímá adresu soketu.

lpSockAddrLen
Ukazatel na délku adresy v lpSockAddr bajtech.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen není dostatečně velký.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEINVAL Soket nebyl vázán na adresu s Bind.

Poznámky

Toto volání je užitečné zejména v případě, že Connect bylo volání provedeno bez Bind provedení prvního volání. Toto volání poskytuje jediné prostředky, pomocí kterých můžete určit místní přidružení, které systém nastavil.

Pokud chcete zpracovávat adresy IPv6, použijte CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Voláním této členské funkce získáte místní název soketu (zpracovává adresy IPv6).

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

Parametry

rSocketAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rSocketPort
Odkaz na UINT port, který ukládá port.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen není dostatečně velký.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEINVAL Soket nebyl vázán na adresu s Bind.

Poznámky

Toto volání je stejné jako CAsyncSocket::GetSockName to, že zpracovává adresy IPv6 i starší protokoly.

Toto volání je užitečné zejména v případě, že Connect bylo volání provedeno bez Bind provedení prvního volání. Toto volání poskytuje jediné prostředky, pomocí kterých můžete určit místní přidružení, které systém nastavil.

CAsyncSocket::GetSockOpt

Voláním této členské funkce načtěte možnost soketu.

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

Parametry

nOptionName
Možnost soketu, pro kterou má být hodnota načtena.

lpOptionValue
Ukazatel na vyrovnávací paměť, ve které se má vrátit hodnota požadované možnosti. Hodnota přidružená k vybrané možnosti je vrácena ve vyrovnávací paměti lpOptionValue. Celé číslo, na které lpOptionLen odkazuje, by mělo původně obsahovat velikost této vyrovnávací paměti v bajtech a při vrácení bude nastavena na velikost vrácené hodnoty. Pro SO_LINGER, to bude velikost LINGER struktury; pro všechny ostatní možnosti bude velikost boOL nebo an int, v závislosti na možnosti. Seznam možností a jejich velikostí najdete v části Poznámky.

lpOptionLen
Ukazatel na velikost lpOptionValue vyrovnávací paměti v bajtech.

nLevel
Úroveň, na které je možnost definována; jedinými podporovanými úrovněmi jsou SOL_SOCKET a IPPROTO_TCP.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Pokud nebyla nikdy nastavena SetSockOptmožnost , GetSockOpt vrátí výchozí hodnotu pro možnost. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpOptionLen byl neplatný.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOPROTOOPT Možnost je neznámá nebo nepodporovaná. Zejména SO_BROADCAST není podporován na soketech typu SOCK_STREAM, while SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, , SO_LINGERa SO_OOBINLINE nejsou podporovány na soketech typu SOCK_DGRAM.

  • WSAENOTSOCK Popisovač není soket.

Poznámky

GetSockOpt načte aktuální hodnotu pro možnost soketu přidruženou k soketu libovolného typu v libovolném stavu a uloží výsledek do lpOptionValue. Možnosti ovlivňují operace soketů, jako je směrování paketů, odchozí přenos dat atd.

Následující možnosti jsou podporovány pro GetSockOpt. Typ identifikuje typ dat adresovaných lpOptionValue. Tato TCP_NODELAY možnost používá úroveň IPPROTO_TCP; všechny ostatní možnosti používají úroveň SOL_SOCKET.

Hodnota Typ Význam
SO_ACCEPTCONN BOOL Soket naslouchá.
SO_BROADCAST BOOL Soket je nakonfigurován pro přenos zpráv všesměrového vysílání.
SO_DEBUG BOOL Ladění je povolené.
SO_DONTLINGER BOOL Pokud je hodnota SO_LINGER true, možnost je zakázaná.
SO_DONTROUTE BOOL Směrování je zakázané.
SO_ERROR int Načtěte stav chyby a zrušte jeho zaškrtnutí.
SO_KEEPALIVE BOOL Neustále se odesílají.
SO_LINGER struct LINGER Vrátí aktuální možnosti přetrvání.
SO_OOBINLINE BOOL Mimo pásmová data se přijímají v normálním datovém proudu.
SO_RCVBUF int Velikost vyrovnávací paměti pro příjem.
SO_REUSEADDR BOOL Soket může být vázán na adresu, která se již používá.
SO_SNDBUF int Velikost vyrovnávací paměti pro odesílání.
SO_TYPE int Typ soketu (například SOCK_STREAM).
TCP_NODELAY BOOL Zakáže algoritmus Nagle pro slučování odesílání.

Možnosti distribuce softwaru Berkeley (BSD) nejsou podporovány pro GetSockOpt :

Hodnota Typ Význam
SO_RCVLOWAT int Přijmout nízkou hladinu.
SO_RCVTIMEO int Příjem časového limitu
SO_SNDLOWAT int Posílejte malou vodní značku.
SO_SNDTIMEO int Časový limit odeslání
IP_OPTIONS Získání možností v hlavičce PROTOKOLU IP
TCP_MAXSEG int Získejte maximální velikost segmentu protokolu TCP.

Volání GetSockOpt s nepodporovanou možností způsobí vrácení kódu WSAENOPROTOOPT chyby z GetLastError.

CAsyncSocket::IOCtl

Voláním této členské funkce můžete řídit režim soketu.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Parametry

lCommand
Příkaz, který se má provést na soketu.

lpArgument
Ukazatel na parametr pro lCommand.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEINVALlCommand není platný příkaz nebo lpArgument není přijatelným parametrem nebo lCommandpříkaz není použitelný pro zadaný typ soketu.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOTSOCK Popisovač není soket.

Poznámky

Tuto rutinu lze použít na jakémkoli soketu v libovolném stavu. Slouží k získání nebo načtení provozních parametrů přidružených k soketu nezávisle na protokolu a subsystému komunikace. Podporují se následující příkazy:

  • FIONBIO Povolte nebo zakažte režim odblokování na soketu. Parametr lpArgument odkazuje na DWORDhodnotu , která je nenulová, pokud má být povolen režim odblokování, a nula, pokud je zakázána. Pokud AsyncSelect byl vydán na soketu, všechny pokusy o použití IOCtl k nastavení soketu zpět do režimu blokování selžou s WSAEINVAL. Chcete-li nastavit soket zpět do blokujícího režimu a zabránit WSAEINVAL chybě, musí aplikace nejprve zakázat AsyncSelect voláním AsyncSelect s parametrem lEvent rovnajícím se 0, a pak volat IOCtl.

  • FIONREAD Určete maximální počet bajtů, které lze číst jedním Receive voláním z tohoto soketu. Parametr lpArgument odkazuje na hodnotu DWORD , do které IOCtl se uloží výsledek. Pokud je tento soket typu SOCK_STREAM, FIONREAD vrátí celkový objem dat, která lze číst v jednom Receive; obvykle je to stejné jako celkové množství dat zařazených do fronty na soketu. Pokud je tento soket typu SOCK_DGRAM, FIONREAD vrátí velikost prvního datagramu zařazeného do fronty na soketu.

  • SIOCATMARK Určete, jestli se všechna nesčetná data čtou. To platí pouze pro soket typu SOCK_STREAM , který byl nakonfigurován pro in-line příjem jakýchkoli mimo pásmových dat ( SO_OOBINLINE). Pokud nečeká na čtení žádná data mimo pásmo, vrátí operace nenulovou hodnotu. V opačném případě vrátí hodnotu 0 a další Receive nebo ReceiveFrom provedená na soketu načte některá nebo všechna data před znakem "mark". Aplikace by měla použít SIOCATMARK operaci k určení, jestli nějaká data zůstanou. Pokud před "urgentní" (mimo pásmová) data existují nějaká normální data, budou přijata v uvedeném pořadí. (Všimněte si, že ve ReceiveFrom stejném volání nebude Receive nikdy kombinovat nesměšněná a normální data.) Parametr lpArgument odkazuje na hodnotuDWORD, do které IOCtl se uloží výsledek.

Tato funkce je podmnožinou, která ioctl() se používá v soketech Berkeley. Konkrétně neexistuje žádný příkaz, který je ekvivalentní FIOASYNC, zatímco SIOCATMARK je jediný příkaz na úrovni soketu, který je podporován.

CAsyncSocket::Listen

Voláním této členské funkce naslouchejte příchozím žádostem o připojení.

BOOL Listen(int nConnectionBacklog = 5);

Parametry

nConnectionBacklog
Maximální délka, na kterou může fronta čekajících připojení růst. Platný rozsah je od 1 do 5.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEADDRINUSE Došlo k pokusu o naslouchání na používané adrese.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEINVAL Soket nebyl vázán Bind nebo je již připojen.

  • WSAEISCONN Soket je již připojen.

  • WSAEMFILE Nejsou k dispozici žádné další popisovače souborů.

  • WSAENOBUFS Není k dispozici žádný prostor vyrovnávací paměti.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPP Odkazovaný soket není typu, který operaci podporuje Listen .

Poznámky

Chcete-li přijímat připojení, je nejprve vytvořen soket s Create, backlog pro příchozí připojení je zadána Listens a poté připojení jsou přijata s Accept. Listen se vztahuje pouze na sokety, které podporují připojení, to znamená ty typu SOCK_STREAM. Tento soket se umístí do "pasivního" režimu, kdy se příchozí připojení potvrdí a zařadí do fronty čekající na přijetí procesem.

Tuto funkci obvykle používají servery (nebo libovolná aplikace, která chce přijímat připojení), které můžou mít současně více než jeden požadavek na připojení: pokud žádost o připojení dorazí s plnou frontou, klient obdrží chybu s indikací WSAECONNREFUSED.

Listen pokud nejsou k dispozici žádné dostupné porty (popisovače), pokusí se nadále fungovat racionálně. Bude přijímat připojení, dokud fronta nevyprázdní. Pokud jsou porty k dispozici, pozdější volání Listen do fronty nebo Accept obnovení fronty do aktuálního nebo nejnovějšího backlogu, pokud je to možné, a v případě potřeby obnoví naslouchání příchozím připojením.

CAsyncSocket::m_hSocket

SOCKET Obsahuje popisovač pro soket zapouzdřený tímto CAsyncSocket objektem.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Volal rozhraní, aby upozorňovat naslouchací soket, že může přijímat čekající žádosti o připojení voláním Accept členské funkce.

virtual void OnAccept(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnAccept funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

Poznámky

Další informace naleznete v tématu Windows Sockets: Oznámení soketů.

CAsyncSocket::OnClose

Volal rozhraní, aby upozorňovat tento soket, že připojený soket je uzavřen jeho procesem.

virtual void OnClose(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnClose funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAECONNRESET Připojení se resetovalo vzdáleně.

  • WSAECONNABORTED Připojení bylo přerušeno kvůli vypršení časového limitu nebo jinému selhání.

Poznámky

Další informace naleznete v tématu Windows Sockets: Oznámení soketů.

CAsyncSocket::OnConnect

Volal rozhraní, aby upozorňovat tento spojovací soket, že jeho pokus o připojení byl dokončen, ať už se úspěšně nebo omylem.

virtual void OnConnect(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnConnect funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAEADDRINUSE Zadaná adresa se už používá.

  • WSAEADDRNOTAVAIL Zadaná adresa není k dispozici na místním počítači.

  • WSAEAFNOSUPPORT Adresy v zadané rodině nelze s tímto soketem použít.

  • WSAECONNREFUSED Pokus o připojení byl vynuceně odmítnut.

  • WSAEDESTADDRREQ Je vyžadována cílová adresa.

  • WSAEFAULT Argument lpSockAddrLen je nesprávný.

  • WSAEINVAL Soket je již vázán na adresu.

  • WSAEISCONN Soket je již připojen.

  • WSAEMFILE Nejsou k dispozici žádné další popisovače souborů.

  • WSAENETUNREACH Síť nelze v tuto chvíli získat z tohoto hostitele.

  • WSAENOBUFS Není k dispozici žádný prostor vyrovnávací paměti. Soket nelze připojit.

  • WSAENOTCONN Soket není připojen.

  • WSAENOTSOCK Popisovač je soubor, nikoli soket.

  • WSAETIMEDOUT Vypršel časový limit pokusu o připojení bez navázání připojení.

Poznámky

Poznámka:

OnConnect Funkce CSocketoznámení se nikdy nevolá. U připojení jednoduše zavoláte Connect, který se vrátí po dokončení připojení (buď úspěšně, nebo omylem). Způsob zpracování oznámení o připojení je podrobnosti implementace MFC.

Další informace naleznete v tématu Windows Sockets: Oznámení soketů.

Příklad

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

Volal rozhraní pro upozornění přijímajícího soketu, že odesílající soket má odchozí data k odeslání.

virtual void OnOutOfBandData(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnOutOfBandData funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

Poznámky

Mimo pásmová data jsou logicky nezávislý kanál, který je přidružený ke každému páru připojených soketů typu SOCK_STREAM. Kanál se obvykle používá k odesílání urgentních dat.

MFC podporuje data mimo pásmo, ale uživatelé třídy CAsyncSocket je nedoporučuje používat. Jednodušší způsob je vytvořit druhý soket pro předávání těchto dat. Další informace o odchozích datech naleznete v tématu Windows Sockets: Oznámení soketů.

CAsyncSocket::OnReceive

Volal rozhraní k upozorňovat tento soket, že v vyrovnávací paměti jsou data, která lze načíst voláním Receive členské funkce.

virtual void OnReceive(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnReceive funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

Poznámky

Další informace naleznete v tématu Windows Sockets: Oznámení soketů.

Příklad

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

Volal rozhraní, aby upozorňovat soket, že teď může odesílat data voláním Send členské funkce.

virtual void OnSend(int nErrorCode);

Parametry

nErrorCode
Poslední chyba v soketu. Následující kódy chyb platí pro členovu OnSend funkci:

  • 0 Funkce byla úspěšně provedena.

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

Poznámky

Další informace naleznete v tématu Windows Sockets: Oznámení soketů.

Příklad

// 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 =

Přiřadí objektu novou hodnotu CAsyncSocket .

void operator=(const CAsyncSocket& rSrc);

Parametry

rSrc
Odkaz na existující CAsyncSocket objekt.

Poznámky

Voláním této funkce zkopírujete existující CAsyncSocket objekt do jiného CAsyncSocket objektu.

CAsyncSocket::operator SOCKET

Tento operátor slouží k načtení SOCKET popisovače objektu CAsyncSocket .

operator SOCKET() const;

Návratová hodnota

Pokud je objekt úspěšný, popisovač objektu SOCKET , NULLjinak .

Poznámky

Popisovač můžete použít k přímému volání rozhraní API systému Windows.

CAsyncSocket::Receive

Voláním této členské funkce můžete přijímat data ze soketu.

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

Parametry

lpBuf
Vyrovnávací paměť pro příchozí data.

nBufLen
Délka lpBuf v bajtech.

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_PEEK Prohlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.

  • MSG_OOB Zpracování dat mimo pásmo

Návratová hodnota

Pokud nedojde k žádné chybě, Receive vrátí počet přijatých bajtů. Pokud bylo připojení uzavřeno, vrátí hodnotu 0. V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAENOTCONN Soket není připojen.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat Receive soket po ShutDown vyvolání s nHow nastavenou na hodnotu 0 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a Receive operace by blokovala.

  • WSAEMSGSIZE Datagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.

  • WSAEINVAL Soket nebyl vázán na Bind.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

Poznámky

Tato funkce se používá pro sokety připojeného datového proudu nebo datagramu a slouží ke čtení příchozích dat.

Pro sokety typu SOCK_STREAMse vrátí tolik informací, kolik je aktuálně k dispozici až do velikosti poskytnuté vyrovnávací paměti. Pokud je soket nakonfigurovaný pro příchozí příjem odchozích dat (možnost SO_OOBINLINEsoketu) a odchozí data jsou nepřečtená, vrátí se pouze odchozí data. Aplikace může použít IOCtlSIOCATMARK možnost nebo OnOutOfBandData určit, jestli se mají číst nějaká mimo pásmová data.

U soketů datagramů se data extrahují z prvního výčtu datagramu až do velikosti zadané vyrovnávací paměti. Pokud je datagram větší než zadaná vyrovnávací paměť, vyrovnávací paměť se vyplní první částí datagramu, dojde ke ztrátě nadbytečných dat a Receive vrátí hodnotu SOCKET_ERROR s kódem chyby nastaveným na WSAEMSGSIZE. Pokud v soketu nejsou k dispozici žádná příchozí data, vrátí se hodnota SOCKET_ERROR s kódem chyby nastaveným na WSAEWOULDBLOCK. Funkci OnReceive zpětného volání lze použít k určení, kdy dorazí více dat.

Pokud je soket typu SOCK_STREAM a vzdálená strana připojení řádně vypne, Receive dokončí se okamžitě s 0 bajty přijatými. Pokud bylo připojení resetováno, Receive chyba selže WSAECONNRESET.

Receive měla by být volána pouze jednou pro každý čas CAsyncSocket::OnReceive .

Příklad

Podívejte se na příklad pro CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Voláním této členské funkce obdržíte datagram a uložíte zdrojovou adresu do SOCKADDR struktury nebo do 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
Vyrovnávací paměť pro příchozí data.

nBufLen
Délka lpBuf v bajtech.

rSocketAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rSocketPort
Odkaz na UINT port, který ukládá port.

lpSockAddr
Ukazatel na SOCKADDR strukturu, která uchovává zdrojovou adresu po vrácení.

lpSockAddrLen
Ukazatel na délku zdrojové adresy v lpSockAddr bajtech.

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_PEEK Prohlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.

  • MSG_OOB Zpracování dat mimo pásmo

Návratová hodnota

Pokud nedojde k žádné chybě, ReceiveFrom vrátí počet přijatých bajtů. Pokud bylo připojení uzavřeno, vrátí hodnotu 0. V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen byl neplatný: lpSockAddr Vyrovnávací paměť byla příliš malá, aby vyhovovala adrese partnerského uzlu.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEINVAL Soket nebyl vázán na Bind.

  • WSAENOTCONN Zásuvka není připojena (SOCK_STREAM pouze).

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat ReceiveFrom soket po ShutDown vyvolání s nHow nastavenou na hodnotu 0 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a ReceiveFrom operace by blokovala.

  • WSAEMSGSIZE Datagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

Poznámky

Tato funkce slouží ke čtení příchozích dat v soketu (případně připojeném) a zachycení adresy, ze které byla data odeslána.

Pro zpracování adres IPv6 použijte CAsyncSocket::ReceiveFromEx.

Pro sokety typu SOCK_STREAMse vrátí tolik informací, kolik je aktuálně k dispozici až do velikosti poskytnuté vyrovnávací paměti. Pokud je soket nakonfigurovaný pro příchozí příjem odchozích dat (možnost SO_OOBINLINEsoketu) a odchozí data jsou nepřečtená, vrátí se pouze odchozí data. Aplikace může použít IOCtlSIOCATMARK možnost nebo OnOutOfBandData určit, jestli se mají číst nějaká mimo pásmová data. Parametry lpSockAddr a lpSockAddrLen sokety se ignorují SOCK_STREAM .

U soketů datagramů se data extrahují z prvního výčtu datagramu až do velikosti zadané vyrovnávací paměti. Pokud je datagram větší než zadaná vyrovnávací paměť, vyrovnávací paměť se vyplní první částí zprávy, nadbytečná data se ztratí a ReceiveFrom vrátí hodnotu SOCKET_ERROR s kódem chyby nastaveným na WSAEMSGSIZE.

Pokud lpSockAddr je nenulový a soket je typu SOCK_DGRAM, síťová adresa soketu, který odeslal data, se zkopíruje do odpovídající SOCKADDR struktury. Hodnota, na kterou lpSockAddrLen odkazuje, je inicializována na velikost této struktury a při návratu je změněna tak, aby indikovala skutečnou velikost adresy uložené tam. Pokud v soketu nejsou k dispozici žádná příchozí data, volání čeká na doručení dat, ReceiveFrom pokud soket neblokuje. V tomto případě se vrátí hodnota SOCKET_ERROR s kódem chyby nastaveným na WSAEWOULDBLOCK. Zpětné OnReceive volání lze použít k určení, kdy dorazí více dat.

Pokud je soket typu SOCK_STREAM a vzdálená strana připojení řádně vypne, ReceiveFrom dokončí se okamžitě s 0 bajty přijatými.

CAsyncSocket::ReceiveFromEx

Voláním této členské funkce obdržíte datagram a uložíte zdrojovou adresu do SOCKADDR struktury nebo do rSocketAddress (zpracovává adresy IPv6).

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

Parametry

lpBuf
Vyrovnávací paměť pro příchozí data.

nBufLen
Délka lpBuf v bajtech.

rSocketAddress
Odkaz na CString objekt, který přijímá IP adresu s tečkovaným číslem.

rSocketPort
Odkaz na UINT port, který ukládá port.

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_PEEK Prohlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.

  • MSG_OOB Zpracování dat mimo pásmo

Návratová hodnota

Pokud nedojde k žádné chybě, ReceiveFromEx vrátí počet přijatých bajtů. Pokud bylo připojení uzavřeno, vrátí hodnotu 0. V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULT Argument lpSockAddrLen byl neplatný: lpSockAddr Vyrovnávací paměť byla příliš malá, aby vyhovovala adrese partnerského uzlu.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEINVAL Soket nebyl vázán na Bind.

  • WSAENOTCONN Zásuvka není připojena (SOCK_STREAM pouze).

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat ReceiveFromEx soket po ShutDown vyvolání s nHow nastavenou na hodnotu 0 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a ReceiveFromEx operace by blokovala.

  • WSAEMSGSIZE Datagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

Poznámky

Tato funkce slouží ke čtení příchozích dat v soketu (případně připojeném) a zachycení adresy, ze které byla data odeslána.

Tato funkce je stejná jako ta, která CAsyncSocket::ReceiveFrom zpracovává adresy IPv6 i starší protokoly.

Pro sokety typu SOCK_STREAMse vrátí tolik informací, kolik je aktuálně k dispozici až do velikosti poskytnuté vyrovnávací paměti. Pokud je soket nakonfigurovaný pro příchozí příjem odchozích dat (možnost SO_OOBINLINEsoketu) a odchozí data jsou nepřečtená, vrátí se pouze odchozí data. Aplikace může použít IOCtlSIOCATMARK možnost nebo OnOutOfBandData určit, jestli se mají číst nějaká mimo pásmová data. Parametry lpSockAddr a lpSockAddrLen sokety se ignorují SOCK_STREAM .

U soketů datagramů se data extrahují z prvního výčtu datagramu až do velikosti zadané vyrovnávací paměti. Pokud je datagram větší než zadaná vyrovnávací paměť, vyrovnávací paměť se vyplní první částí zprávy, nadbytečná data se ztratí a ReceiveFromEx vrátí hodnotu SOCKET_ERROR s kódem chyby nastaveným na WSAEMSGSIZE.

Pokud lpSockAddr je nenulový a soket je typu SOCK_DGRAM, síťová adresa soketu, který odeslal data, se zkopíruje do odpovídající SOCKADDR struktury. Hodnota, na kterou lpSockAddrLen odkazuje, je inicializována na velikost této struktury a při návratu je změněna tak, aby indikovala skutečnou velikost adresy uložené tam. Pokud v soketu nejsou k dispozici žádná příchozí data, volání čeká na doručení dat, ReceiveFromEx pokud soket neblokuje. V tomto případě se vrátí hodnota SOCKET_ERROR s kódem chyby nastaveným na WSAEWOULDBLOCK. Zpětné OnReceive volání lze použít k určení, kdy dorazí více dat.

Pokud je soket typu SOCK_STREAM a vzdálená strana připojení řádně vypne, ReceiveFromEx dokončí se okamžitě s 0 bajty přijatými.

CAsyncSocket::Send

Voláním této členské funkce odešlete data na připojeném soketu.

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

Parametry

lpBuf
Vyrovnávací paměť obsahující data, která se mají přenést.

nBufLen
Délka dat vbajch lpBuf

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_DONTROUTE Určuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.

  • MSG_OOB Odesílání dat mimo pásmo (SOCK_STREAM pouze).

Návratová hodnota

Pokud nedojde k žádné chybě, Send vrátí celkový počet odeslaných znaků. (Všimněte si, že to může být menší než číslo uvedené nBufLen.) V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEACCES Požadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEFAULT Argument lpBuf není v platné části adresního prostoru uživatele.

  • WSAENETRESET Připojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.

  • WSAENOBUFS Implementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.

  • WSAENOTCONN Soket není připojen.

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat Send na soket po ShutDown vyvolání s nHow nastavenou na hodnotu 1 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a požadovaná operace by blokovala.

  • WSAEMSGSIZE Soket je typu SOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.

  • WSAEINVAL Soket nebyl vázán na Bind.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

Poznámky

Send slouží k zápisu odchozích dat do připojených datových proudů nebo soketů datagramu. U soketů datagramů je třeba věnovat pozornost tomu, aby nepřekročila maximální velikost paketů PROTOKOLU IP podkladových podsítí, které je dáno prvkem iMaxUdpDg ve WSADATA struktuře vrácené AfxSocketInit. Pokud jsou data příliš dlouhá, aby se předávala atomicky prostřednictvím základního protokolu, vrátí se chyba WSAEMSGSIZE prostřednictvím GetLastErrora nepřenáší se žádná data.

Všimněte si, že u soketu datagramu úspěšné dokončení Send neindikuje, že data byla úspěšně doručena.

U CAsyncSocket objektů typu SOCK_STREAMmůže být počet zapsaných bajtů mezi 1 a požadovanou délkou v závislosti na dostupnosti vyrovnávací paměti na místních i cizích hostitelích.

Příklad

Podívejte se na příklad pro CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Voláním této členské funkce odešlete data do konkrétního cíle.

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
Vyrovnávací paměť obsahující data, která se mají přenést.

nBufLen
Délka dat vbajch lpBuf

nHostPort
Port identifikující aplikaci soketu.

lpszHostAddress
Síťová adresa soketu, ke kterému je tento objekt připojený: název počítače, například "ftp.microsoft.com", nebo tečkované číslo, například "128.56.22.8".

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_DONTROUTE Určuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.

  • MSG_OOB Odesílání dat mimo pásmo (SOCK_STREAM pouze).

lpSockAddr
Ukazatel na SOCKADDR strukturu, která obsahuje adresu cílového soketu.

nSockAddrLen
Délka adresy vbajch lpSockAddr

Návratová hodnota

Pokud nedojde k žádné chybě, SendTo vrátí celkový počet odeslaných znaků. (Všimněte si, že to může být menší než číslo uvedené nBufLen.) V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEACCES Požadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEFAULTlpSockAddr Parametry lpBuf nejsou součástí adresního prostoru uživatele nebo lpSockAddr argument je příliš malý (menší než velikost SOCKADDR struktury).

  • WSAEINVAL Název hostitele je neplatný.

  • WSAENETRESET Připojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.

  • WSAENOBUFS Implementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.

  • WSAENOTCONN Zásuvka není připojena (SOCK_STREAM pouze).

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat SendTo na soket po ShutDown vyvolání s nHow nastavenou na hodnotu 1 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a požadovaná operace by blokovala.

  • WSAEMSGSIZE Soket je typu SOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

  • WSAEADDRNOTAVAIL Zadaná adresa není k dispozici na místním počítači.

  • WSAEAFNOSUPPORT Adresy v zadané rodině nelze s tímto soketem použít.

  • WSAEDESTADDRREQ Je vyžadována cílová adresa.

  • WSAENETUNREACH Síť nelze v tuto chvíli získat z tohoto hostitele.

Poznámky

SendTo se používá v soketech datagramu nebo streamu a slouží k zápisu odchozích dat do soketu. U soketů datagramů je nutné věnovat pozornost překročení maximální velikosti paketů PROTOKOLU IP podkladových podsítí, které je dáno prvkem iMaxUdpDg ve WSADATA struktuře vyplněným AfxSocketInit. Pokud jsou data příliš dlouhá, aby se předávala atomicky prostřednictvím základního protokolu, vrátí se chyba WSAEMSGSIZE a nepřenáší se žádná data.

Všimněte si, že úspěšné dokončení SendTo neznačí, že data byla úspěšně doručena.

SendTo se používá pouze na soketu SOCK_DGRAM k odeslání datagramu do konkrétního soketu identifikovaného parametrem lpSockAddr .

Pokud chcete odeslat všesměrové vysílání (pouze na SOCK_DGRAM úrovni), měla by být adresa v lpSockAddr parametru vytvořena pomocí speciální IP adresy INADDR_BROADCAST (definované v souboru WINSOCK.Hhlavičky Windows Sockets) spolu s zamýšleným číslem portu. Nebo pokud lpszHostAddress je NULLparametr , soket je nakonfigurován pro všesměrové vysílání. Obecně se dá zjistit, že datagram všesměrového vysílání překročí velikost, při které může dojít k fragmentaci, což znamená, že datová část datagramu (s výjimkou hlaviček) by neměla překročit 512 bajtů.

Pro zpracování adres IPv6 použijte CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Voláním této členské funkce odešlete data do konkrétního cíle (zpracovává adresy IPv6).

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

Parametry

lpBuf
Vyrovnávací paměť obsahující data, která se mají přenést.

nBufLen
Délka dat vbajch lpBuf

nHostPort
Port identifikující aplikaci soketu.

lpszHostAddress
Síťová adresa soketu, ke kterému je tento objekt připojený: název počítače, například "ftp.microsoft.com", nebo tečkované číslo, například "128.56.22.8".

nFlags
Určuje způsob, jakým se volání provádí. Sémantika této funkce je určena možnostmi soketu a parametrem nFlags . Druhá hodnota je vytvořena kombinací některé z následujících hodnot s bitovým operátorem OR jazyka C++(|):

  • MSG_DONTROUTE Určuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.

  • MSG_OOB Odesílání dat mimo pásmo (SOCK_STREAM pouze).

Návratová hodnota

Pokud nedojde k žádné chybě, SendToEx vrátí celkový počet odeslaných znaků. (Všimněte si, že to může být menší než číslo uvedené nBufLen.) V opačném případě je vrácena hodnota SOCKET_ERROR a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEACCES Požadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEFAULTlpSockAddr Parametry lpBuf nejsou součástí adresního prostoru uživatele nebo lpSockAddr argument je příliš malý (menší než velikost SOCKADDR struktury).

  • WSAEINVAL Název hostitele je neplatný.

  • WSAENETRESET Připojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.

  • WSAENOBUFS Implementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.

  • WSAENOTCONN Zásuvka není připojena (SOCK_STREAM pouze).

  • WSAENOTSOCK Popisovač není soket.

  • WSAEOPNOTSUPPMSG_OOB byla zadána, ale soket není typu SOCK_STREAM.

  • WSAESHUTDOWN Zásuvka byla vypnuta; Není možné volat SendToEx na soket po ShutDown vyvolání s nHow nastavenou na hodnotu 1 nebo 2.

  • WSAEWOULDBLOCK Soket je označen jako neblokující a požadovaná operace by blokovala.

  • WSAEMSGSIZE Soket je typu SOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.

  • WSAECONNABORTED Virtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.

  • WSAECONNRESET Virtuální okruh byl resetován vzdálenou stranou.

  • WSAEADDRNOTAVAIL Zadaná adresa není k dispozici na místním počítači.

  • WSAEAFNOSUPPORT Adresy v zadané rodině nelze s tímto soketem použít.

  • WSAEDESTADDRREQ Je vyžadována cílová adresa.

  • WSAENETUNREACH Síť nelze v tuto chvíli získat z tohoto hostitele.

Poznámky

Tato metoda je stejná jako CAsyncSocket::SendTo s tím rozdílem, že zpracovává adresy IPv6 i starší protokoly.

SendToEx se používá v soketech datagramu nebo streamu a slouží k zápisu odchozích dat do soketu. U soketů datagramů je nutné věnovat pozornost překročení maximální velikosti paketů PROTOKOLU IP podkladových podsítí, které je dáno prvkem iMaxUdpDg ve WSADATA struktuře vyplněným AfxSocketInit. Pokud jsou data příliš dlouhá, aby se předávala atomicky prostřednictvím základního protokolu, vrátí se chyba WSAEMSGSIZE a nepřenáší se žádná data.

Všimněte si, že úspěšné dokončení SendToEx neznačí, že data byla úspěšně doručena.

SendToEx se používá pouze na soketu SOCK_DGRAM k odeslání datagramu do konkrétního soketu identifikovaného parametrem lpSockAddr .

Pokud chcete odeslat všesměrové vysílání (pouze na SOCK_DGRAM úrovni), měla by být adresa v lpSockAddr parametru vytvořena pomocí speciální IP adresy INADDR_BROADCAST (definované v souboru WINSOCK.Hhlavičky Windows Sockets) spolu s zamýšleným číslem portu. Nebo pokud lpszHostAddress je NULLparametr , soket je nakonfigurován pro všesměrové vysílání. Obecně se dá zjistit, že datagram všesměrového vysílání překročí velikost, při které může dojít k fragmentaci, což znamená, že datová část datagramu (s výjimkou hlaviček) by neměla překročit 512 bajtů.

CAsyncSocket::SetSockOpt

Voláním této členské funkce nastavíte možnost soketu.

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

Parametry

nOptionName
Možnost soketu, pro kterou má být nastavena hodnota.

lpOptionValue
Ukazatel na vyrovnávací paměť, ve které je zadána hodnota požadované možnosti.

nOptionLen
Velikost lpOptionValue vyrovnávací paměti v bajtech.

nLevel
Úroveň, na které je možnost definována; jedinými podporovanými úrovněmi jsou SOL_SOCKET a IPPROTO_TCP.

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEFAULTlpOptionValue není v platné části adresního prostoru procesu.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAEINVALnLevel není platné nebo informace v lpOptionValue souboru nejsou platné.

  • WSAENETRESET Když je nastavené připojení, vypršel časový limit SO_KEEPALIVE připojení.

  • WSAENOPROTOOPT Možnost je neznámá nebo nepodporovaná. Zejména SO_BROADCAST se nepodporuje u soketů typu SOCK_STREAM, while SO_DONTLINGER, SO_KEEPALIVESO_LINGERa SO_OOBINLINE nejsou podporovány na soketech typu SOCK_DGRAM.

  • WSAENOTCONN Po nastavení se připojení resetovalo SO_KEEPALIVE .

  • WSAENOTSOCK Popisovač není soket.

Poznámky

SetSockOpt nastaví aktuální hodnotu pro možnost soketu přidruženou k soketu libovolného typu v libovolném stavu. I když možnosti mohou existovat na více úrovních protokolu, tato specifikace definuje pouze možnosti, které existují na nejvyšší úrovni "soketu". Možnosti ovlivňují operace soketů, jako je například to, jestli se urychlená data přijímají v normálním datovém proudu, zda lze zprávy všesměrového vysílání odesílat na soketu atd.

Existují dva typy možností soketů: logické možnosti, které povolují nebo zakazují funkci nebo chování, a možnosti, které vyžadují celočíselnou hodnotu nebo strukturu. Pokud chcete povolit logickou možnost, lpOptionValue odkazuje na nenulové celé číslo. Zakázání možnosti lpOptionValue odkazuje na celé číslo, které se rovná nule. nOptionLen měla by být rovna sizeof(BOOL) logickým možnostem. U jiných možností lpOptionValue odkazuje na celé číslo nebo strukturu obsahující požadovanou hodnotu pro tuto možnost a nOptionLen je délka celého čísla nebo struktury.

SO_LINGER řídí akci prováděnou při zařazení neodehraných dat do fronty na soketu a Close zavolá se funkce pro zavření soketu.

Ve výchozím nastavení nelze soket vázat (viz Bind) na místní adresu, která se již používá. Při příležitosti však může být žádoucí "znovu použít" adresu tímto způsobem. Vzhledem k tomu, že každé připojení je jedinečně identifikováno kombinací místních a vzdálených adres, není problém s tím, že dva sokety vázané na stejnou místní adresu, pokud jsou vzdálené adresy odlišné.

Chcete-li informovat implementaci rozhraní Windows Sockets, že Bind volání na soketu by nemělo být zakázáno, protože požadovaná adresa je již používána jiným soketem, měla by aplikace nastavit SO_REUSEADDR možnost soketu pro soket před vydáním Bind volání. Všimněte si, že možnost je interpretována pouze v době Bind volání: proto není nutné (ale neškodné) nastavit možnost na soketu, která není vázána na existující adresu, a nastavení nebo resetování možnosti po Bind volání nemá žádný vliv na tento ani jiný soket.

Aplikace může požadovat, aby implementace rozhraní Windows Sockets umožňovala použití paketů "keep-alive" u připojení TCP (Transmission Control Protocol) zapnutím možnosti soketu SO_KEEPALIVE . Implementace rozhraní Windows Sockets nemusí podporovat použití udržování naživu: pokud ano, přesná sémantika je specifická pro implementaci, ale měla by odpovídat oddílu 4.2.3.6 RFC 1122: "Požadavky na internetové hostitele – komunikační vrstvy". Pokud se připojení zahodí jako výsledek "keep-alives", vrátí se kód WSAENETRESET chyby všem probíhajícím voláním v soketu a všechny následné volání selžou WSAENOTCONN.

Tato TCP_NODELAY možnost zakáže algoritmus Nagle. Algoritmus Nagle se používá ke snížení počtu malých paketů odesílaných hostitelem do vyrovnávací paměti pro nenaznačené odesílání dat, dokud nebude možné odeslat paket s plnou velikostí. U některých aplikací však tento algoritmus může bránit výkonu a TCP_NODELAY lze ho použít k jeho vypnutí. Zapisovače aplikací by neměly být nastaveny TCP_NODELAY , pokud to nemá dobrý dopad na to, že nastavení TCP_NODELAY může mít významný negativní dopad na výkon sítě. TCP_NODELAY je jediná podporovaná možnost soketu, která používá úroveň IPPROTO_TCP; všechny ostatní možnosti používají úroveň SOL_SOCKET.

Některé implementace rozhraní Windows Sockets poskytují výstupní ladicí informace, pokud SO_DEBUG je možnost nastavena aplikací.

Následující možnosti jsou podporovány pro SetSockOpt. Typ identifikuje typ dat adresovaných lpOptionValue.

Hodnota Typ Význam
SO_BROADCAST BOOL Povolí přenos zpráv všesměrového vysílání na soketu.
SO_DEBUG BOOL Zaznamenává informace o ladění.
SO_DONTLINGER BOOL Neblokujte Close čekání na odeslání neodeslaných dat. Nastavení této možnosti odpovídá nastavení SO_LINGER s nastaveným l_onoff na nulu.
SO_DONTROUTE BOOL Neusměrovávejte: odešlete přímo do rozhraní.
SO_KEEPALIVE BOOL Posílejte živé.
SO_LINGER struct LINGER Pokud existují neodeznaná data, zachovají Close se dál.
SO_OOBINLINE BOOL Příjem dat mimo pásma v normálním datovém proudu
SO_RCVBUF int Zadejte velikost vyrovnávací paměti pro příjem.
SO_REUSEADDR BOOL Povolit, aby soket byl svázán s adresou, která se už používá. (Viz Bind.)
SO_SNDBUF int Zadejte velikost vyrovnávací paměti pro odesílání.
TCP_NODELAY BOOL Zakáže algoritmus Nagle pro slučování odesílání.

Možnosti distribuce softwaru Berkeley (BSD) nejsou podporovány pro SetSockOpt :

Hodnota Typ Význam
SO_ACCEPTCONN BOOL Soket naslouchá
SO_ERROR int Získejte stav chyby a zrušte jeho zaškrtnutí.
SO_RCVLOWAT int Přijmout nízkou hladinu.
SO_RCVTIMEO int Vypršení časového limitu příjmu
SO_SNDLOWAT int Posílejte malou vodní značku.
SO_SNDTIMEO int Časový limit odeslání
SO_TYPE int Typ soketu.
IP_OPTIONS Nastavte pole možností v hlavičce PROTOKOLU IP.

CAsyncSocket::ShutDown

Voláním této členské funkce zakážete odesílání, přijímání nebo obojí na soketu.

BOOL ShutDown(int nHow = sends);

Parametry

nHow
Příznak, který popisuje, jaké typy operací už nebudou povoleny, pomocí následujících výčtových hodnot:

  • receives = 0

  • sends = 1

  • oba = 2

Návratová hodnota

Nenulové, pokud je funkce úspěšná; jinak 0 a konkrétní kód chyby lze načíst voláním GetLastError. Následující chyby platí pro tuto členovu funkci:

  • WSANOTINITIALISED Před použitím tohoto rozhraní API musí proběhnout úspěšně AfxSocketInit .

  • WSAENETDOWN Implementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.

  • WSAEINVALnHow není platný.

  • WSAEINPROGRESS Probíhá blokující operace Windows Sockets.

  • WSAENOTCONN Zásuvka není připojena (SOCK_STREAM pouze).

  • WSAENOTSOCK Popisovač není soket.

Poznámky

ShutDown se používá na všech typech soketů k zakázání příjmu, přenosu nebo obojího. Pokud nHow je 0, následné přijetí na soketu bude zakázáno. To nemá žádný vliv na nižší vrstvy protokolu.

V případě protokolu TCP (Transmission Control Protocol) se okno TCP nezmění a příchozí data budou přijata (ale nebudou potvrzena), dokud se okno nevyčerpá. Pro protokol UDP (User Datagram Protocol) se příchozí datagramy přijímají a zařadí do fronty. V žádném případě se nevygeneruje chybový paket PROTOKOLU ICMP. Pokud nHow je 1, následné odeslání se nepovolí. Pro sokety TCP se odešle FIN. Nastavení nHow na 2 zakáže odesílání i přijímání, jak je popsáno výše.

Všimněte si, že ShutDown nezavírá soket a prostředky připojené k soketu nebudou uvolněny, dokud Close nebude volána. Aplikace by neměla spoléhat na možnost opakovaně používat soket po vypnutí. Zejména implementace rozhraní Windows Sockets není nutná k podpoře použití Connect takového soketu.

Příklad

Podívejte se na příklad pro CAsyncSocket::OnReceive.

CASyncSocket::Socket

Přidělí popisovač soketu.

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
Určuje SOCK_STREAM nebo SOCK_DGRAM.

lEvent
Bitová maska, která určuje kombinaci síťových událostí, o které se aplikace zajímá.

  • FD_READ: Chcete dostávat oznámení o připravenosti ke čtení.

  • FD_WRITE: Chcete dostávat oznámení o připravenosti na psaní.

  • FD_OOB: Chcete dostávat oznámení o přijetí odchozích dat.

  • FD_ACCEPT: Chcete dostávat oznámení o příchozích připojeních.

  • FD_CONNECT: Chcete dostávat oznámení o dokončených připojeních.

  • FD_CLOSE: Chcete dostávat oznámení o uzavření soketu.

nProtocolType
Protokol, který se má použít se soketem, který je specifický pro uvedenou řadu adres.

nAddressFormat
Specifikace rodiny adres

Návratová hodnota

Vrátí TRUE úspěch FALSE při selhání.

Poznámky

Tato metoda přidělí popisovač soketu. Volání soketu s určitou adresou nevyvolá CAsyncSocket::Bind , takže budete muset později volat Bind , aby se soket svážel se zadanou adresou. Před vazbou můžete nastavit CAsyncSocket::SetSockOpt možnost soketu.

Viz také

CObject Třída
Graf hierarchie
CSocket Třída
CSocketFile Třída