Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 SOCKET objektuCAsyncSocket. |
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
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLenje příliš malý (menší než velikostSOCKADDRstruktury).WSAEINPROGRESSProbíhá blokující volání rozhraní Windows Sockets.WSAEINVALListennebyl vyvolán před přijetím.WSAEMFILEFronta je po přijetí prázdná a nejsou k dispozici žádné popisovače.WSAENOBUFSNení k dispozici žádný prostor vyrovnávací paměti.WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPOdkazovaný soket není typem, který podporuje službu zaměřenou na připojení.WSAEWOULDBLOCKSoket 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_READChcete dostávat oznámení o připravenosti ke čtení.FD_WRITEChcete dostávat oznámení, když jsou data k dispozici ke čtení.FD_OOBChcete dostávat oznámení o přijetí odchozích dat.FD_ACCEPTChcete dostávat oznámení o příchozích připojeních.FD_CONNECTChcete dostávat oznámení o výsledcích připojení.FD_CLOSEChcete 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEINVALOznačuje, že jeden ze zadaných parametrů byl neplatný.WSAEINPROGRESSProbí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_READChcete dostávat oznámení o připravenosti ke čtení.FD_WRITEChcete dostávat oznámení, když jsou data k dispozici ke čtení.FD_OOBChcete dostávat oznámení o přijetí odchozích dat.FD_ACCEPTChcete dostávat oznámení o příchozích připojeních.FD_CONNECTChcete dostávat oznámení o výsledcích připojení.FD_CLOSEChcete 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.
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEADDRINUSEZadaná adresa se už používá. (Viz možnost soketuSO_REUSEADDRv částiSetSockOpt.)WSAEFAULTArgumentnSockAddrLenje příliš malý (menší než velikostSOCKADDRstruktury).WSAEINPROGRESSProbíhá blokující volání rozhraní Windows Sockets.WSAEAFNOSUPPORTTento port nepodporuje zadanou řadu adres.WSAEINVALSoket je již vázán na adresu.WSAENOBUFSNení k dispozici dostatek vyrovnávacích pamětí, příliš mnoho připojení.WSAENOTSOCKPopisovač 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 CAsyncSocketCSocket, 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEADDRINUSEZadaná adresa se už používá.WSAEINPROGRESSProbíhá blokující volání rozhraní Windows Sockets.WSAEADDRNOTAVAILZadaná adresa není k dispozici na místním počítači.WSAEAFNOSUPPORTAdresy v zadané rodině nelze s tímto soketem použít.WSAECONNREFUSEDPokus o připojení byl odmítnut.WSAEDESTADDRREQJe vyžadována cílová adresa.WSAEFAULTArgumentnSockAddrLenje nesprávný.WSAEINVALNeplatná adresa hostiteleWSAEISCONNSoket je již připojen.WSAEMFILENejsou k dispozici žádné další popisovače souborů.WSAENETUNREACHSíť nelze v tuto chvíli získat z tohoto hostitele.WSAENOBUFSNení k dispozici žádný prostor vyrovnávací paměti. Soket nelze připojit.WSAENOTSOCKPopisovač není soket.WSAETIMEDOUTDošlo k vypršení časového limitu připojení bez navázání připojení.WSAEWOULDBLOCKSoket 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_READChcete dostávat oznámení o připravenosti ke čtení.FD_WRITEChcete dostávat oznámení o připravenosti na psaní.FD_OOBChcete dostávat oznámení o přijetí odchozích dat.FD_ACCEPTChcete dostávat oznámení o příchozích připojeních.FD_CONNECTChcete dostávat oznámení o dokončených připojeních.FD_CLOSEChcete 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEAFNOSUPPORTZadaná řada adres se nepodporuje.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEMFILENejsou k dispozici žádné další popisovače souborů.WSAENOBUFSNení k dispozici žádný prostor vyrovnávací paměti. Soket nelze vytvořit.WSAEPROTONOSUPPORTZadaný port není podporován.WSAEPROTOTYPEZadaný port je pro tento soket nesprávný typ.WSAESOCKTNOSUPPORTZadaný 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_STREAMPoskytuje 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_DGRAMPodporuje 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á
Acceptfunkce jako parametr přebírá odkaz na nový prázdnýCSocketobjekt. Tento objekt je nutné sestavit před volánímAccept. Mějte na paměti, že pokud tento objekt soketu přestane být obor, připojení se zavře. NevolejteCreatepro 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_READChcete dostávat oznámení o připravenosti ke čtení.FD_WRITEChcete dostávat oznámení o připravenosti na psaní.FD_OOBChcete dostávat oznámení o přijetí odchozích dat.FD_ACCEPTChcete dostávat oznámení o příchozích připojeních.FD_CONNECTChcete dostávat oznámení o dokončených připojeních.FD_CLOSEChcete 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 CAsyncSocket pokud není k objektu NULL připojen CAsyncSocketžádný hSocket 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLennení dostatečně velký.WSAEINPROGRESSProbíhá blokující volání rozhraní Windows Sockets.WSAENOTCONNSoket není připojen.WSAENOTSOCKPopisovač 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLennení dostatečně velký.WSAEINPROGRESSProbíhá blokující volání rozhraní Windows Sockets.WSAENOTCONNSoket není připojen.WSAENOTSOCKPopisovač 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLennení dostatečně velký.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOTSOCKPopisovač není soket.WSAEINVALSoket nebyl vázán na adresu sBind.
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLennení dostatečně velký.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOTSOCKPopisovač není soket.WSAEINVALSoket nebyl vázán na adresu sBind.
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpOptionLenbyl neplatný.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOPROTOOPTMožnost je neznámá nebo nepodporovaná. ZejménaSO_BROADCASTnení podporován na soketech typuSOCK_STREAM, whileSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE, ,SO_LINGERaSO_OOBINLINEnejsou podporovány na soketech typuSOCK_DGRAM.WSAENOTSOCKPopisovač 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEINVALlCommandnení platný příkaz nebolpArgumentnení přijatelným parametrem nebolCommandpříkaz není použitelný pro zadaný typ soketu.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOTSOCKPopisovač 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:
FIONBIOPovolte nebo zakažte režim odblokování na soketu. ParametrlpArgumentodkazuje naDWORDhodnotu , která je nenulová, pokud má být povolen režim odblokování, a nula, pokud je zakázána. PokudAsyncSelectbyl vydán na soketu, všechny pokusy o použitíIOCtlk nastavení soketu zpět do režimu blokování selžou sWSAEINVAL. Chcete-li nastavit soket zpět do blokujícího režimu a zabránitWSAEINVALchybě, musí aplikace nejprve zakázatAsyncSelectvolánímAsyncSelects parametremlEventrovnajícím se 0, a pak volatIOCtl.FIONREADUrčete maximální počet bajtů, které lze číst jednímReceivevoláním z tohoto soketu. ParametrlpArgumentodkazuje na hodnotuDWORD, do kteréIOCtlse uloží výsledek. Pokud je tento soket typuSOCK_STREAM,FIONREADvrátí celkový objem dat, která lze číst v jednomReceive; obvykle je to stejné jako celkové množství dat zařazených do fronty na soketu. Pokud je tento soket typuSOCK_DGRAM,FIONREADvrátí velikost prvního datagramu zařazeného do fronty na soketu.SIOCATMARKUrčete, jestli se všechna nesčetná data čtou. To platí jenom pro soket typuSOCK_STREAM, který je nakonfigurovaný pro příchozí 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šíReceiveneboReceiveFromprovedená na soketu načte některá nebo všechna data před znakem "mark". Aplikace by měla použítSIOCATMARKoperaci 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 veReceivestejném volání nebudeReceiveFromnikdy kombinovat nesměšněná a normální data.) ParametrlpArgumentodkazuje na hodnotuDWORD, do kteréIOCtlse 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEADDRINUSEDošlo k pokusu o naslouchání na používané adrese.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEINVALSoket nebyl vázánBindnebo je již připojen.WSAEISCONNSoket je již připojen.WSAEMFILENejsou k dispozici žádné další popisovače souborů.WSAENOBUFSNení k dispozici žádný prostor vyrovnávací paměti.WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPOdkazovaný soket není typu, který operaci podporujeListen.
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.
WSAENETDOWNImplementace 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.
WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAECONNRESETPřipojení se resetovalo vzdáleně.WSAECONNABORTEDPř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.
WSAEADDRINUSEZadaná adresa se už používá.WSAEADDRNOTAVAILZadaná adresa není k dispozici na místním počítači.WSAEAFNOSUPPORTAdresy v zadané rodině nelze s tímto soketem použít.WSAECONNREFUSEDPokus o připojení byl vynuceně odmítnut.WSAEDESTADDRREQJe vyžadována cílová adresa.WSAEFAULTArgumentlpSockAddrLenje nesprávný.WSAEINVALSoket je již vázán na adresu.WSAEISCONNSoket je již připojen.WSAEMFILENejsou k dispozici žádné další popisovače souborů.WSAENETUNREACHSíť nelze v tuto chvíli získat z tohoto hostitele.WSAENOBUFSNení k dispozici žádný prostor vyrovnávací paměti. Soket nelze připojit.WSAENOTCONNSoket není připojen.WSAENOTSOCKPopisovač je soubor, nikoli soket.WSAETIMEDOUTVypršel časový limit pokusu o připojení bez navázání připojení.
Poznámky
Poznámka:
CSocket Funkce OnConnectozná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.
WSAENETDOWNImplementace 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.
WSAENETDOWNImplementace 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.
WSAENETDOWNImplementace 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_PEEKProhlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.MSG_OOBZpracová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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAENOTCONNSoket není připojen.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatReceivesoket poShutDownvyvolání snHownastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující aReceiveoperace by blokovala.WSAEMSGSIZEDatagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.WSAEINVALSoket nebyl vázán naBind.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuá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_PEEKProhlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.MSG_OOBZpracová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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLenbyl neplatný:lpSockAddrVyrovnávací paměť byla příliš malá, aby vyhovovala adrese partnerského uzlu.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEINVALSoket nebyl vázán naBind.WSAENOTCONNZásuvka není připojena (SOCK_STREAMpouze).WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatReceiveFromsoket poShutDownvyvolání snHownastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující aReceiveFromoperace by blokovala.WSAEMSGSIZEDatagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuá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_PEEKProhlédněte si příchozí data. Data se zkopírují do vyrovnávací paměti, ale neodeberou se ze vstupní fronty.MSG_OOBZpracová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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTArgumentlpSockAddrLenbyl neplatný:lpSockAddrVyrovnávací paměť byla příliš malá, aby vyhovovala adrese partnerského uzlu.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEINVALSoket nebyl vázán naBind.WSAENOTCONNZásuvka není připojena (SOCK_STREAMpouze).WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatReceiveFromExsoket poShutDownvyvolání snHownastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující aReceiveFromExoperace by blokovala.WSAEMSGSIZEDatagram byl příliš velký, aby se vešl do zadané vyrovnávací paměti a byl zkrácen.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuá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_DONTROUTEUrčuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.MSG_OOBOdesílání dat mimo pásmo (SOCK_STREAMpouze).
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEACCESPožadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEFAULTArgumentlpBufnení v platné části adresního prostoru uživatele.WSAENETRESETPřipojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.WSAENOBUFSImplementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.WSAENOTCONNSoket není připojen.WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatSendna soket poShutDownvyvolání snHownastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZESoket je typuSOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.WSAEINVALSoket nebyl vázán naBind.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuá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_DONTROUTEUrčuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.MSG_OOBOdesílání dat mimo pásmo (SOCK_STREAMpouze).
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEACCESPožadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEFAULTlpBufParametrylpSockAddrnejsou součástí adresního prostoru uživatele nebolpSockAddrargument je příliš malý (menší než velikostSOCKADDRstruktury).WSAEINVALNázev hostitele je neplatný.WSAENETRESETPřipojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.WSAENOBUFSImplementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.WSAENOTCONNZásuvka není připojena (SOCK_STREAMpouze).WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatSendTona soket poShutDownvyvolání snHownastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZESoket je typuSOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuální okruh byl resetován vzdálenou stranou.WSAEADDRNOTAVAILZadaná adresa není k dispozici na místním počítači.WSAEAFNOSUPPORTAdresy v zadané rodině nelze s tímto soketem použít.WSAEDESTADDRREQJe vyžadována cílová adresa.WSAENETUNREACHSíť 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_DONTROUTEUrčuje, že data by neměla být předmětem směrování. Dodavatel windows Sockets může tento příznak ignorovat.MSG_OOBOdesílání dat mimo pásmo (SOCK_STREAMpouze).
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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEACCESPožadovaná adresa je adresa všesměrového vysílání, ale příslušný příznak nebyl nastaven.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEFAULTlpBufParametrylpSockAddrnejsou součástí adresního prostoru uživatele nebolpSockAddrargument je příliš malý (menší než velikostSOCKADDRstruktury).WSAEINVALNázev hostitele je neplatný.WSAENETRESETPřipojení musí být resetováno, protože implementace rozhraní Windows Sockets ho zahodila.WSAENOBUFSImplementace rozhraní Windows Sockets hlásí zablokování vyrovnávací paměti.WSAENOTCONNZásuvka není připojena (SOCK_STREAMpouze).WSAENOTSOCKPopisovač není soket.WSAEOPNOTSUPPMSG_OOBbyla zadána, ale soket není typuSOCK_STREAM.WSAESHUTDOWNZásuvka byla vypnuta; Není možné volatSendToExna soket poShutDownvyvolání snHownastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCKSoket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZESoket je typuSOCK_DGRAMa datagram je větší než maximum podporované implementací rozhraní Windows Sockets.WSAECONNABORTEDVirtuální okruh byl přerušen kvůli vypršení časového limitu nebo jinému selhání.WSAECONNRESETVirtuální okruh byl resetován vzdálenou stranou.WSAEADDRNOTAVAILZadaná adresa není k dispozici na místním počítači.WSAEAFNOSUPPORTAdresy v zadané rodině nelze s tímto soketem použít.WSAEDESTADDRREQJe vyžadována cílová adresa.WSAENETUNREACHSíť 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEFAULTlpOptionValuenení v platné části adresního prostoru procesu.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAEINVALnLevelnení platné nebo informace vlpOptionValuesouboru nejsou platné.WSAENETRESETKdyž je nastavené připojení, vypršel časový limitSO_KEEPALIVEpřipojení.WSAENOPROTOOPTMožnost je neznámá nebo nepodporovaná. ZejménaSO_BROADCASTse nepodporuje u soketů typuSOCK_STREAM, whileSO_DONTLINGER,SO_KEEPALIVESO_LINGERaSO_OOBINLINEnejsou podporovány na soketech typuSOCK_DGRAM.WSAENOTCONNPo nastavení se připojení resetovaloSO_KEEPALIVE.WSAENOTSOCKPopisovač 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:
WSANOTINITIALISEDPřed použitím tohoto rozhraní API musí proběhnout úspěšněAfxSocketInit.WSAENETDOWNImplementace rozhraní Windows Sockets zjistila, že síťový subsystém selhal.WSAEINVALnHownení platný.WSAEINPROGRESSProbíhá blokující operace Windows Sockets.WSAENOTCONNZásuvka není připojena (SOCK_STREAMpouze).WSAENOTSOCKPopisovač 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