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
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é lpSockAddr
odkazuje ; 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
ArgumentlpSockAddrLen
je příliš malý (menší než velikostSOCKADDR
struktury).WSAEINPROGRESS
Probíhá blokující volání rozhraní Windows Sockets.WSAEINVAL
Listen
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_STREAM
je .
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 soketuSO_REUSEADDR
v částiSetSockOpt
.)WSAEFAULT
ArgumentnSockAddrLen
je příliš malý (menší než velikostSOCKADDR
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 CSocket
CAsyncSocket
, 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 WSAEWOULDBLOCK
chyby 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
ArgumentnSockAddrLen
je nesprávný.WSAEINVAL
Neplatná adresa hostiteleWSAEISCONN
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ímAccept
. Mějte na paměti, že pokud tento objekt soketu přestane být obor, připojení se zavře. NevolejteCreate
pro tento nový objekt soketu.
Důležité
Create
není 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 NULL
hodnotu .
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
ArgumentlpSockAddrLen
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
ArgumentlpSockAddrLen
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
ArgumentlpSockAddrLen
není dostatečně velký.WSAEINPROGRESS
Probíhá blokující operace Windows Sockets.WSAENOTSOCK
Popisovač není soket.WSAEINVAL
Soket 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:
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
ArgumentlpSockAddrLen
není dostatečně velký.WSAEINPROGRESS
Probíhá blokující operace Windows Sockets.WSAENOTSOCK
Popisovač není soket.WSAEINVAL
Soket 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 SetSockOpt
mož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
ArgumentlpOptionLen
byl neplatný.WSAEINPROGRESS
Probíhá blokující operace Windows Sockets.WSAENOPROTOOPT
Možnost je neznámá nebo nepodporovaná. ZejménaSO_BROADCAST
není podporován na soketech typuSOCK_STREAM
, whileSO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
, ,SO_LINGER
aSO_OOBINLINE
nejsou podporovány na soketech typuSOCK_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.WSAEINVAL
lCommand
není platný příkaz nebolpArgument
není přijatelným parametrem nebolCommand
pří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. ParametrlpArgument
odkazuje naDWORD
hodnotu , která je nenulová, pokud má být povolen režim odblokování, a nula, pokud je zakázána. PokudAsyncSelect
byl vydán na soketu, všechny pokusy o použitíIOCtl
k 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ánitWSAEINVAL
chybě, musí aplikace nejprve zakázatAsyncSelect
volánímAsyncSelect
s parametremlEvent
rovnajícím se 0, a pak volatIOCtl
.FIONREAD
Určete maximální počet bajtů, které lze číst jednímReceive
voláním z tohoto soketu. ParametrlpArgument
odkazuje na hodnotuDWORD
, do kteréIOCtl
se uloží výsledek. Pokud je tento soket typuSOCK_STREAM
,FIONREAD
vrá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
,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 typuSOCK_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
neboReceiveFrom
provedená na soketu načte některá nebo všechna data před znakem "mark". Aplikace by měla použítSIOCATMARK
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 veReceiveFrom
stejném volání nebudeReceive
nikdy kombinovat nesměšněná a normální data.) ParametrlpArgument
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ánBind
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 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 Listen
s 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
ArgumentlpSockAddrLen
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 CSocket
ozná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
, NULL
jinak .
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.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatReceive
soket poShutDown
vyvolání snHow
nastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující aReceive
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 naBind
.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_STREAM
se 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_OOBINLINE
soketu) 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
ArgumentlpSockAddrLen
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 naBind
.WSAENOTCONN
Zásuvka není připojena (SOCK_STREAM
pouze).WSAENOTSOCK
Popisovač není soket.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatReceiveFrom
soket poShutDown
vyvolání snHow
nastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující aReceiveFrom
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_STREAM
se 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_OOBINLINE
soketu) 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
ArgumentlpSockAddrLen
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 naBind
.WSAENOTCONN
Zásuvka není připojena (SOCK_STREAM
pouze).WSAENOTSOCK
Popisovač není soket.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatReceiveFromEx
soket poShutDown
vyvolání snHow
nastavenou na hodnotu 0 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující aReceiveFromEx
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_STREAM
se 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_OOBINLINE
soketu) 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
ArgumentlpBuf
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.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatSend
na soket poShutDown
vyvolání snHow
nastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZE
Soket je typuSOCK_DGRAM
a datagram je větší než maximum podporované implementací rozhraní Windows Sockets.WSAEINVAL
Soket nebyl vázán naBind
.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 GetLastError
a 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_STREAM
můž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.WSAEFAULT
lpSockAddr
ParametrylpBuf
nejsou součástí adresního prostoru uživatele nebolpSockAddr
argument je příliš malý (menší než velikostSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatSendTo
na soket poShutDown
vyvolání snHow
nastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZE
Soket je typuSOCK_DGRAM
a 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.H
hlavičky Windows Sockets) spolu s zamýšleným číslem portu. Nebo pokud lpszHostAddress
je NULL
parametr , 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.WSAEFAULT
lpSockAddr
ParametrylpBuf
nejsou součástí adresního prostoru uživatele nebolpSockAddr
argument je příliš malý (menší než velikostSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
byla zadána, ale soket není typuSOCK_STREAM
.WSAESHUTDOWN
Zásuvka byla vypnuta; Není možné volatSendToEx
na soket poShutDown
vyvolání snHow
nastavenou na hodnotu 1 nebo 2.WSAEWOULDBLOCK
Soket je označen jako neblokující a požadovaná operace by blokovala.WSAEMSGSIZE
Soket je typuSOCK_DGRAM
a 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.H
hlavičky Windows Sockets) spolu s zamýšleným číslem portu. Nebo pokud lpszHostAddress
je NULL
parametr , 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.WSAEFAULT
lpOptionValue
není v platné části adresního prostoru procesu.WSAEINPROGRESS
Probíhá blokující operace Windows Sockets.WSAEINVAL
nLevel
není platné nebo informace vlpOptionValue
souboru nejsou platné.WSAENETRESET
Když je nastavené připojení, vypršel časový limitSO_KEEPALIVE
připojení.WSAENOPROTOOPT
Možnost je neznámá nebo nepodporovaná. ZejménaSO_BROADCAST
se nepodporuje u soketů typuSOCK_STREAM
, whileSO_DONTLINGER
,SO_KEEPALIVE
SO_LINGER
aSO_OOBINLINE
nejsou podporovány na soketech typuSOCK_DGRAM
.WSAENOTCONN
Po nastavení se připojení resetovaloSO_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.WSAEINVAL
nHow
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