Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Representerar en Windows Socket – en slutpunkt för nätverkskommunikation.
Syntax
class CAsyncSocket : public CObject
Medlemmar
Offentliga konstruktorer
| Namn | Beskrivning |
|---|---|
CAsyncSocket::CAsyncSocket |
Konstruerar ett CAsyncSocket objekt. |
Offentliga metoder
| Namn | Beskrivning |
|---|---|
CAsyncSocket::Accept |
Accepterar en anslutning på socketen. |
CAsyncSocket::AsyncSelect |
Begär händelsemeddelande för socketen. |
CAsyncSocket::Attach |
Kopplar ett sockethandtag till ett CAsyncSocket objekt. |
CAsyncSocket::Bind |
Associerar en lokal adress med socketen. |
CAsyncSocket::Close |
Stänger uttaget. |
CAsyncSocket::Connect |
Upprättar en anslutning till en peer-socket. |
CAsyncSocket::Create |
Skapar en socket. |
CAsyncSocket::CreateEx |
Skapar en socket med avancerade alternativ. |
CAsyncSocket::Detach |
Kopplar från ett sockethandtag från ett CAsyncSocket objekt. |
CAsyncSocket::FromHandle |
Returnerar en pekare till ett CAsyncSocket objekt, givet ett sockethandtag. |
CAsyncSocket::GetLastError |
Hämtar felstatus för den senaste åtgärden som misslyckades. |
CAsyncSocket::GetPeerName |
Hämtar adressen till peer-socketen som socketen är ansluten till. |
CAsyncSocket::GetPeerNameEx |
Hämtar adressen till peer-socketen som socketen är ansluten till (hanterar IPv6-adresser). |
CAsyncSocket::GetSockName |
Hämtar det lokala namnet på en socket. |
CAsyncSocket::GetSockNameEx |
Hämtar det lokala namnet på en socket (hanterar IPv6-adresser). |
CAsyncSocket::GetSockOpt |
Hämtar ett socketalternativ. |
CAsyncSocket::IOCtl |
Styr socketens läge. |
CAsyncSocket::Listen |
Upprättar en socket för att lyssna efter inkommande anslutningsbegäranden. |
CAsyncSocket::Receive |
Tar emot data från socketen. |
CAsyncSocket::ReceiveFrom |
Tar emot ett datagram och lagrar källadressen. |
CAsyncSocket::ReceiveFromEx |
Tar emot ett datagram och lagrar källadressen (hanterar IPv6-adresser). |
CAsyncSocket::Send |
Skickar data till en ansluten socket. |
CAsyncSocket::SendTo |
Skickar data till ett specifikt mål. |
CAsyncSocket::SendToEx |
Skickar data till ett specifikt mål (hanterar IPv6-adresser). |
CAsyncSocket::SetSockOpt |
Anger ett socketalternativ. |
CAsyncSocket::ShutDown |
Inaktiverar Send och/eller Receive anrop på socketen. |
CASyncSocket::Socket |
Allokerar ett sockethandtag. |
Skyddade metoder
| Namn | Beskrivning |
|---|---|
CAsyncSocket::OnAccept |
Meddelar en lyssnings socket att den kan acceptera väntande anslutningsbegäranden genom att anropa Accept. |
CAsyncSocket::OnClose |
Meddelar ett uttag som socketen som är ansluten till den har stängts. |
CAsyncSocket::OnConnect |
Meddelar en anslutningssocket att anslutningsförsöket är slutfört, oavsett om det är ett fel eller ett fel. |
CAsyncSocket::OnOutOfBandData |
Meddelar en mottagande socket att det finns out-of-band-data som ska läsas på socketen, vanligtvis ett brådskande meddelande. |
CAsyncSocket::OnReceive |
Meddelar en lyssnings socket att det finns data som ska hämtas genom att anropa Receive. |
CAsyncSocket::OnSend |
Meddelar en socket att den kan skicka data genom att anropa Send. |
Offentliga operatörer
| Namn | Beskrivning |
|---|---|
| CAsyncSocket::operator = | Tilldelar ett nytt värde till ett CAsyncSocket objekt. |
| CAsyncSocket::operator SOCKET | Använd den här operatorn för att hämta SOCKET objektets CAsyncSocket handtag. |
Medlemmar i offentliga data
| Namn | Beskrivning |
|---|---|
CAsyncSocket::m_hSocket |
Anger handtaget SOCKET som är kopplat till det här CAsyncSocket objektet. |
Anmärkningar
Klassen CAsyncSocket kapslar in Windows Socket Functions-API:et, vilket ger en objektorienterad abstraktion för programmerare som vill använda Windows Sockets tillsammans med MFC.
Den här klassen baseras på antagandet att du förstår nätverkskommunikation. Du ansvarar för att hantera blockering, skillnader i byteordning och konverteringar mellan MBCS-strängar (Unicode och MBCS). Om du vill ha ett bekvämare gränssnitt som hanterar dessa problem åt dig kan du läsa klassen CSocket.
Om du vill använda ett CAsyncSocket objekt anropar du konstruktorn och anropar Create sedan funktionen för att skapa det underliggande sockethandtaget (typ SOCKET), förutom på godkända socketar. För en server socket anropa Listen medlemsfunktionen och för en klient socket anropa Connect medlemsfunktionen. Server-socketen Accept bör anropa funktionen när du tar emot en anslutningsbegäran. Använd de återstående CAsyncSocket funktionerna för att utföra kommunikation mellan socketar. När det är klart förstör du CAsyncSocket objektet om det skapades på heapen. Destructor anropar Close automatiskt funktionen. Datatypen SOCKET beskrivs i artikeln Windows Sockets: Background.
Anmärkning
När du använder MFC-socketar i sekundära trådar i ett statiskt länkat MFC-program måste du anropa AfxSocketInit varje tråd som använder socketar för att initiera socketbiblioteken. Som standard AfxSocketInit anropas endast i den primära tråden.
Mer information finns i Windows Sockets: Using Class CAsyncSocket and related articles., as as as Windows Sockets 2 API(Windows Sockets 2 API).
Arvshierarki
CAsyncSocket
Kravspecifikation
rubrik:afxsock.h
CAsyncSocket::Accept
Anropa den här medlemsfunktionen för att acceptera en anslutning på en socket.
virtual BOOL Accept(
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL);
Parameterar
rConnectedSocket
En referens som identifierar en ny socket som är tillgänglig för anslutning.
lpSockAddr
En pekare till en SOCKADDR struktur som tar emot adressen för anslutningssocketen, som det kallas i nätverket. Det exakta formatet för lpSockAddr argumentet bestäms av adressfamiljen som upprättades när socketen skapades. Om lpSockAddr och/eller lpSockAddrLen är lika med NULLreturneras ingen information om fjärradressen för den godkända socketen.
lpSockAddrLen
En pekare till längden på adressen i lpSockAddr byte.
lpSockAddrLen är en värderesultatparameter: den bör inledningsvis innehålla den mängd utrymme som pekas på av lpSockAddr. Vid retur innehåller den den faktiska längden (i byte) för den returnerade adressen.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenär för litet (mindre än storleken på enSOCKADDRstruktur).WSAEINPROGRESSEtt blockerande Windows Sockets-anrop pågår.WSAEINVALListenanropades inte innan det accepterades.WSAEMFILEKön är tom när den godkänns och det finns inga tillgängliga beskrivningar.WSAENOBUFSDet finns inget buffertutrymme.WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPDen refererade socketen är inte en typ som stöder anslutningsorienterad tjänst.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och det finns inga anslutningar som kan accepteras.
Anmärkningar
Den här rutinen extraherar den första anslutningen i kön med väntande anslutningar, skapar en ny socket med samma egenskaper som den här socketen och kopplar den till rConnectedSocket. Om det inte finns några väntande anslutningar i kön Accept returnerar noll och GetLastError returnerar ett fel. Den godkända socketen (rConnectedSocket) kan inte användas för att acceptera fler anslutningar. Den ursprungliga socketen förblir öppen och lyssnar.
Argumentet lpSockAddr är en resultatparameter som fylls i med adressen för den anslutande socketen, som kallas för kommunikationsskiktet.
Accept används med anslutningsbaserade sockettyper som SOCK_STREAM.
CAsyncSocket::AsyncSelect
Anropa den här medlemsfunktionen för att begära händelsemeddelande för en socket.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameterar
lEvent
En bitmask som anger en kombination av nätverkshändelser som programmet är intresserat av.
FD_READVill ta emot meddelande om beredskap för läsning.FD_WRITEVill få ett meddelande när data är tillgängliga för att läsas.FD_OOBVill få ett meddelande om ankomsten av out-of-band-data.FD_ACCEPTVill ta emot meddelanden om inkommande anslutningar.FD_CONNECTVill få meddelande om anslutningsresultat.FD_CLOSEVill få ett meddelande när en socket har stängts av en peer.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEINVALAnger att en av de angivna parametrarna var ogiltig.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.
Anmärkningar
Den här funktionen används för att ange vilka MFC-återanropsmeddelandefunktioner som ska anropas för socketen.
AsyncSelect ställer automatiskt in den här socketen i icke-blockeringsläge. Mer information finns i artikeln Windows Sockets: Socket Notifications (Windows Sockets: Socket Notifications).
CAsyncSocket::Attach
Anropa den här medlemsfunktionen för att koppla hSocket handtaget till ett CAsyncSocket objekt.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameterar
hSocket
Innehåller ett handtag till en socket.
lEvent
En bitmask som anger en kombination av nätverkshändelser som programmet är intresserat av.
FD_READVill ta emot meddelande om beredskap för läsning.FD_WRITEVill få ett meddelande när data är tillgängliga för att läsas.FD_OOBVill få ett meddelande om ankomsten av out-of-band-data.FD_ACCEPTVill ta emot meddelanden om inkommande anslutningar.FD_CONNECTVill få meddelande om anslutningsresultat.FD_CLOSEVill få ett meddelande när en socket har stängts av en peer.
Returvärde
Nonzero om funktionen lyckas.
Anmärkningar
Handtaget SOCKET lagras i objektets m_hSocket datamedlem.
CAsyncSocket::Bind
Anropa den här medlemsfunktionen för att associera en lokal adress med socketen.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameterar
nSocketPort
Porten som identifierar socket-programmet.
lpszSocketAddress
Nätverksadressen, ett prickat tal som "128.56.22.8". Att skicka strängen för den NULL här parametern anger att instansen CAsyncSocket ska lyssna efter klientaktivitet i alla nätverksgränssnitt.
lpSockAddr
En pekare till en SOCKADDR struktur som innehåller adressen som ska tilldelas till den här socketen.
nSockAddrLen
Längden på adressen i lpSockAddr byte.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. I följande lista beskrivs några av de fel som kan returneras. En fullständig lista finns i Felkoder för Windows Sockets.
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEADDRINUSEDen angivna adressen används redan. (Se socketalternativetSO_REUSEADDRunderSetSockOpt.)WSAEFAULTArgumentetnSockAddrLenär för litet (mindre än storleken på enSOCKADDRstruktur).WSAEINPROGRESSEtt blockerande Windows Sockets-anrop pågår.WSAEAFNOSUPPORTDen angivna adressfamiljen stöds inte av den här porten.WSAEINVALSocketen är redan bunden till en adress.WSAENOBUFSDet finns inte tillräckligt med tillgängliga buffertar, för många anslutningar.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
Den här rutinen används på ett oanslutet datagram eller strömsocket före efterföljande Connect eller Listen anrop. Innan den kan acceptera anslutningsbegäranden måste en lyssnarserversockel välja ett portnummer och göra det känt för Windows Sockets genom att anropa Bind.
Bind upprättar den lokala associationen (värdadress/portnummer) för socketen genom att tilldela ett lokalt namn till en namnlös socket.
CAsyncSocket::CAsyncSocket
Konstruerar ett tomt socketobjekt.
CAsyncSocket();
Anmärkningar
När du har skapat objektet måste du anropa dess Create medlemsfunktion för att skapa SOCKET datastrukturen och binda dess adress. (På serversidan av en Windows Sockets-kommunikation, när lyssningsuttaget skapar en socket som ska användas i anropet, anropar Accept du inte för den socketenCreate.)
CAsyncSocket::Close
Stänger uttaget.
virtual void Close();
Anmärkningar
Den här funktionen släpper socket-beskrivningen så att ytterligare referenser till den misslyckas med felet WSAENOTSOCK. Om detta är den sista referensen till den underliggande socketen ignoreras den associerade namngivningsinformationen och köade data. Socket-objektets destruktor anropar Close dig.
För CAsyncSocket, men inte för CSocket, påverkas semantiken för av Close socketalternativen SO_LINGER och SO_DONTLINGER. Mer information finns i medlemsfunktionen GetSockOpt.
CAsyncSocket::Connect
Anropa den här medlemsfunktionen för att upprätta en anslutning till en oansluten ström eller ett datagram.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameterar
lpszHostAddress
Nätverksadressen för socketen som det här objektet är anslutet till: ett datornamn som "ftp.microsoft.com" eller ett prickat tal som "128.56.22.8".
nHostPort
Porten som identifierar socket-programmet.
lpSockAddr
En pekare till en SOCKADDR struktur som innehåller adressen till den anslutna socketen.
nSockAddrLen
Längden på adressen i lpSockAddr byte.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Om detta indikerar en felkod för WSAEWOULDBLOCK, och programmet använder de tvingande återanropen, får programmet ett OnConnect meddelande när anslutningsåtgärden är klar. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEADDRINUSEDen angivna adressen används redan.WSAEINPROGRESSEtt blockerande Windows Sockets-anrop pågår.WSAEADDRNOTAVAILDen angivna adressen är inte tillgänglig från den lokala datorn.WSAEAFNOSUPPORTAdresser i den angivna familjen kan inte användas med den här socketen.WSAECONNREFUSEDAnslutningsförsöket avvisades.WSAEDESTADDRREQEn måladress krävs.WSAEFAULTArgumentetnSockAddrLenär felaktigt.WSAEINVALOgiltig värdadress.WSAEISCONNSocketen är redan ansluten.WSAEMFILEInga fler filbeskrivningar är tillgängliga.WSAENETUNREACHDet går inte att nå nätverket från den här värden just nu.WSAENOBUFSDet finns inget buffertutrymme. Det går inte att ansluta socketen.WSAENOTSOCKBeskrivningen är inte en socket.WSAETIMEDOUTFörsök att ansluta tidsgränsen för anslutningen utan att upprätta en anslutning.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och anslutningen kan inte slutföras omedelbart.
Anmärkningar
Om socketen är obunden tilldelas unika värden till den lokala associationen av systemet och socketen markeras som bunden. Observera att om adressfältet i namnstrukturen är noll returneras Connect noll. Om du vill få utökad felinformation anropar du GetLastError medlemsfunktionen.
För stream sockets (typ SOCK_STREAM) initieras en aktiv anslutning till den externa värden. När socketanropet har slutförts är socketen redo att skicka/ta emot data.
För ett datagramsocket (typ SOCK_DGRAM) anges ett standardmål som används vid efterföljande Send och Receive anrop.
CAsyncSocket::Create
Create Anropa medlemsfunktionen när du har skapat ett socketobjekt för att skapa Windows-socketen och koppla den.
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);
Parameterar
nSocketPort
En välkänd port som ska användas med socketen, eller 0 om du vill att Windows Sockets ska välja en port.
nSocketType
SOCK_STREAM eller SOCK_DGRAM.
lEvent
En bitmask som anger en kombination av nätverkshändelser som programmet är intresserat av.
FD_READVill ta emot meddelande om beredskap för läsning.FD_WRITEVill ta emot meddelande om beredskap för att skriva.FD_OOBVill få ett meddelande om ankomsten av out-of-band-data.FD_ACCEPTVill ta emot meddelanden om inkommande anslutningar.FD_CONNECTVill ta emot meddelande om slutförd anslutning.FD_CLOSEVill ta emot meddelande om socketstängning.
lpszSockAddress
En pekare till en sträng som innehåller nätverksadressen för den anslutna socketen, ett prickat tal som "128.56.22.8". Att skicka strängen för den NULL här parametern anger att instansen CAsyncSocket ska lyssna efter klientaktivitet i alla nätverksgränssnitt.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEAFNOSUPPORTDen angivna adressfamiljen stöds inte.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEMFILEInga fler filbeskrivningar är tillgängliga.WSAENOBUFSDet finns inget buffertutrymme. Det går inte att skapa socketen.WSAEPROTONOSUPPORTDen angivna porten stöds inte.WSAEPROTOTYPEDen angivna porten är fel typ för den här socketen.WSAESOCKTNOSUPPORTDen angivna sockettypen stöds inte i den här adressfamiljen.
Anmärkningar
Create anropar Socket och om det lyckas anropas Bind den för att binda socketen till den angivna adressen. Följande sockettyper stöds:
SOCK_STREAMTillhandahåller sekvenserade, tillförlitliga, fullständiga duplex-, anslutningsbaserade byteströmmar. Använder TCP (Transmission Control Protocol) för Internetadressfamiljen.SOCK_DGRAMStöder datagram, som är anslutningslösa, otillförlitliga paket med en fast (vanligtvis liten) maximal längd. Använder UDP (User Datagram Protocol) för Internetadressfamiljen.Anmärkning
Medlemsfunktionen
Acceptanvänder en referens till ett nytt, tomtCSocketobjekt som parameter. Du måste skapa det här objektet innan du anroparAccept. Tänk på att om det här socketobjektet hamnar utanför omfånget stängs anslutningen. AnropaCreateinte för det nya socketobjektet.
Viktigt!
Create är inte trådsäkert. Om du anropar den i en miljö med flera trådar där den kan anropas samtidigt av olika trådar bör du skydda varje anrop med ett mutex- eller annat synkroniseringslås.
Mer information om ström- och datagram-socketar finns i artiklarna Windows Sockets: Background and Windows Sockets: Ports and Socket Addresses and Windows Sockets 2 API (Windows Sockets: Background and Windows Sockets: Ports and Socket Addresses and Windows Sockets 2 API).
CAsyncSocket::CreateEx
CreateEx Anropa medlemsfunktionen när du har skapat ett socketobjekt för att skapa Windows-socketen och koppla den.
Använd den här funktionen när du behöver ange avancerade alternativ, till exempel sockettypen.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameterar
pAI
En pekare till en ADDRINFOT för att lagra socketinformation, till exempel familj och sockettyp.
lEvent
En bitmask som anger en kombination av nätverkshändelser som programmet är intresserat av.
FD_READVill ta emot meddelande om beredskap för läsning.FD_WRITEVill ta emot meddelande om beredskap för att skriva.FD_OOBVill få ett meddelande om ankomsten av out-of-band-data.FD_ACCEPTVill ta emot meddelanden om inkommande anslutningar.FD_CONNECTVill ta emot meddelande om slutförd anslutning.FD_CLOSEVill ta emot meddelande om socketstängning.
Returvärde
Se returvärdet för Create().
Anmärkningar
Se kommentarerna för Create().
CAsyncSocket::Detach
Anropa den här medlemsfunktionen för att koppla bort SOCKET handtaget i m_hSocket datamedlemmen från CAsyncSocket objektet och ange m_hSocket till NULL.
SOCKET Detach();
CAsyncSocket::FromHandle
Returnerar en pekare till ett CAsyncSocket objekt.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parameterar
hSocket
Innehåller ett handtag till en socket.
Returvärde
En pekare till ett CAsyncSocket objekt, eller NULL om det inte finns något CAsyncSocket objekt kopplat till hSocket.
Anmärkningar
Om ett SOCKET objekt inte är kopplat till handtaget när det ges ett CAsyncSocket handtag returnerar NULLmedlemsfunktionen .
CAsyncSocket::GetLastError
Anropa den här medlemsfunktionen för att hämta felstatusen för den senaste åtgärden som misslyckades.
static int PASCAL GetLastError();
Returvärde
Returvärdet anger felkoden för den senaste Windows Sockets API-rutinen som utfördes av den här tråden.
Anmärkningar
När en viss medlemsfunktion anger att ett fel har inträffat ska anropas GetLastError för att hämta rätt felkod. Se funktionsbeskrivningarna för enskilda medlemmar för en lista över tillämpliga felkoder.
Mer information om felkoderna finns i Api:et för Windows Sockets 2.
CAsyncSocket::GetPeerName
Anropa den här medlemsfunktionen för att hämta adressen till peer-socketen som den här socketen är ansluten till.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameterar
rPeerAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rPeerPort
Referens till en UINT som lagrar en port.
lpSockAddr
En pekare till strukturen SOCKADDR som tar emot namnet på peer-socketen.
lpSockAddrLen
En pekare till längden på adressen i lpSockAddr byte. Vid retur lpSockAddrLen innehåller argumentet den faktiska storleken för lpSockAddr returnerade byte.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenär inte tillräckligt stort.WSAEINPROGRESSEtt blockerande Windows Sockets-anrop pågår.WSAENOTCONNSocketen är inte ansluten.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
Om du vill hantera IPv6-adresser använder du CAsyncSocket::GetPeerNameEx.
CAsyncSocket::GetPeerNameEx
Anropa den här medlemsfunktionen för att hämta adressen till peer-socketen som den här socketen är ansluten till (hanterar IPv6-adresser).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parameterar
rPeerAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rPeerPort
Referens till en UINT som lagrar en port.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenär inte tillräckligt stort.WSAEINPROGRESSEtt blockerande Windows Sockets-anrop pågår.WSAENOTCONNSocketen är inte ansluten.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
Den här funktionen är densamma som CAsyncSocket::GetPeerName förutom att den hanterar IPv6-adresser och äldre protokoll.
CAsyncSocket::GetSockName
Anropa den här medlemsfunktionen för att hämta det lokala namnet på en socket.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameterar
rSocketAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rSocketPort
Referens till en UINT som lagrar en port.
lpSockAddr
En pekare till en SOCKADDR struktur som tar emot socketens adress.
lpSockAddrLen
En pekare till längden på adressen i lpSockAddr byte.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenär inte tillräckligt stort.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOTSOCKBeskrivningen är inte en socket.WSAEINVALSocketen har inte bundits till en adress medBind.
Anmärkningar
Det här anropet är särskilt användbart när ett Connect anrop har gjorts utan att göra ett Bind första. Det här anropet ger det enda sättet att fastställa den lokala association som har angetts av systemet.
Om du vill hantera IPv6-adresser använder du CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
Anropa den här medlemsfunktionen för att hämta det lokala namnet på en socket (hanterar IPv6-adresser).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parameterar
rSocketAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rSocketPort
Referens till en UINT som lagrar en port.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenär inte tillräckligt stort.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOTSOCKBeskrivningen är inte en socket.WSAEINVALSocketen har inte bundits till en adress medBind.
Anmärkningar
Det här anropet är detsamma som CAsyncSocket::GetSockName förutom att det hanterar IPv6-adresser och äldre protokoll.
Det här anropet är särskilt användbart när ett Connect anrop har gjorts utan att göra ett Bind första. Det här anropet ger det enda sättet att fastställa den lokala association som har angetts av systemet.
CAsyncSocket::GetSockOpt
Anropa den här medlemsfunktionen för att hämta ett socketalternativ.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parameterar
nOptionName
Socket-alternativet som värdet ska hämtas för.
lpOptionValue
En pekare till bufferten där värdet för det begärda alternativet ska returneras. Värdet som är associerat med det valda alternativet returneras i bufferten lpOptionValue. Heltalet som pekas på av lpOptionLen ska ursprungligen innehålla storleken på bufferten i byte. Vid retur anges det till storleken på det returnerade värdet. För SO_LINGERär detta storleken på en LINGER struktur. För alla andra alternativ blir det storleken på en BOOL eller en int, beroende på alternativet. Se listan över alternativ och deras storlekar i avsnittet Kommentarer.
lpOptionLen
En pekare till buffertens lpOptionValue storlek i byte.
nLevel
Den nivå där alternativet definieras. de enda nivåerna som stöds är SOL_SOCKET och IPPROTO_TCP.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Om ett alternativ aldrig har angetts med SetSockOptreturnerar standardvärdet GetSockOpt för alternativet. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpOptionLenvar ogiltigt.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOPROTOOPTAlternativet är okänt eller stöds inte. I synnerhetSO_BROADCASTstöds inte på socketar av typenSOCK_STREAM, medanSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE,SO_LINGERochSO_OOBINLINEinte stöds på socketar av typenSOCK_DGRAM.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
GetSockOpt hämtar det aktuella värdet för ett socketalternativ som är associerat med en socket av valfri typ, i alla tillstånd, och lagrar resultatet i lpOptionValue. Alternativen påverkar socketåtgärder, till exempel routning av paket, out-of-band-dataöverföring och så vidare.
Följande alternativ stöds för GetSockOpt. Typen identifierar den typ av data som adresseras av lpOptionValue. Alternativet TCP_NODELAY använder nivån IPPROTO_TCP; alla andra alternativ använder nivån SOL_SOCKET.
| Värde | Typ | Innebörd |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket lyssnar. |
SO_BROADCAST |
BOOL |
Socket har konfigurerats för överföring av sändningsmeddelanden. |
SO_DEBUG |
BOOL |
Felsökning är aktiverat. |
SO_DONTLINGER |
BOOL |
Om sant är alternativet SO_LINGER inaktiverat. |
SO_DONTROUTE |
BOOL |
Routning är inaktiverat. |
SO_ERROR |
int |
Hämta felstatus och rensa. |
SO_KEEPALIVE |
BOOL |
Keep-alives skickas. |
SO_LINGER |
struct LINGER |
Returnerar de aktuella lingeralternativen. |
SO_OOBINLINE |
BOOL |
Out-of-band-data tas emot i den normala dataströmmen. |
SO_RCVBUF |
int |
Buffertstorlek för mottagningar. |
SO_REUSEADDR |
BOOL |
Socketen kan bindas till en adress som redan används. |
SO_SNDBUF |
int |
Buffertstorlek för skickar. |
SO_TYPE |
int |
Typ av socket (till exempel SOCK_STREAM). |
TCP_NODELAY |
BOOL |
Inaktiverar Nagle-algoritmen för sammankoppling av meddelanden. |
Alternativ för Berkeley Software Distribution (BSD) som inte stöds för GetSockOpt är:
| Värde | Typ | Innebörd |
|---|---|---|
SO_RCVLOWAT |
int |
Ta emot lågvattenmärke. |
SO_RCVTIMEO |
int |
Ta emot timeout. |
SO_SNDLOWAT |
int |
Skicka lågvattenmärke. |
SO_SNDTIMEO |
int |
Skicka timeout. |
IP_OPTIONS |
Hämta alternativ i IP-huvud. | |
TCP_MAXSEG |
int |
Hämta maximal segmentstorlek för TCP. |
Om du anropar GetSockOpt med ett alternativ som inte stöds kommer en felkod WSAENOPROTOOPT att returneras från GetLastError.
CAsyncSocket::IOCtl
Anropa den här medlemsfunktionen för att styra läget för en socket.
BOOL IOCtl(
long lCommand,
DWORD* lpArgument);
Parameterar
lCommand
Kommandot som ska utföras på socketen.
lpArgument
En pekare till en parameter för lCommand.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEINVALlCommandär inte ett giltigt kommando, ellerlpArgumentär inte en acceptabel parameter förlCommand, eller så är kommandot inte tillämpligt för den typ av socket som anges.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
Den här rutinen kan användas på alla socketar i alla tillstånd. Den används för att hämta eller hämta driftparametrar som är associerade med socketen, oberoende av delsystemet protokoll och kommunikation. Följande kommandon stöds:
FIONBIOAktivera eller inaktivera icke-blockeringsläge på socketen. ParameternlpArgumentpekar på enDWORD, som inte är noll om icke-blockeringsläget ska aktiveras och noll om det ska inaktiveras. OmAsyncSelecthar utfärdats på en socket misslyckas alla försök att användaIOCtlför att ställa in socketen tillbaka till blockeringsläget medWSAEINVAL. För att ställa in socketen tillbaka till blockeringsläge och förhindraWSAEINVALfelet måste ett program först inaktiveraAsyncSelectgenom att anropaAsyncSelectmed parameternlEventlika med 0 och sedan anropaIOCtl.FIONREADFastställ det maximala antalet byte som kan läsas med ettReceiveanrop från den här socketen. ParameternlpArgumentpekar på enDWORDdärIOCtlresultatet lagras. Om den här socketen är av typenSOCK_STREAMFIONREADreturnerar den totala mängden data som kan läsas i en endaReceive. Detta är normalt samma som den totala mängden data som köas i socketen. Om den här socketen är av typenSOCK_DGRAMFIONREADreturnerar storleken på det första datagram som köas på socketen.SIOCATMARKAvgör om alla out-of-band-data har lästs. Detta gäller endast för en socket av typenSOCK_STREAMsom har konfigurerats för in-line mottagning av out-of-band-data (SO_OOBINLINE). Om inga out-of-band-data väntar på att läsas returnerar åtgärden nonzero. Annars returneras 0, och nästaReceiveellerReceiveFromutförda på socketen hämtar en del eller alla data som föregår "mark". Programmet bör användaSIOCATMARKåtgärden för att avgöra om några data finns kvar. Om det finns några normala data som föregår "brådskande" (out-of-band) data, tas de emot i ordning. (Observera att enReceiveellerReceiveFromaldrig kommer att blanda out-of-band och normala data i samma anrop.) ParameternlpArgumentpekar på enDWORDdärIOCtlresultatet lagras.
Den här funktionen är en delmängd av ioctl() som används i Berkeley-socketar. I synnerhet finns det inget kommando som motsvarar FIOASYNC, medan SIOCATMARK är det enda socketnivåkommandot som stöds.
CAsyncSocket::Listen
Anropa den här medlemsfunktionen för att lyssna efter inkommande anslutningsbegäranden.
BOOL Listen(int nConnectionBacklog = 5);
Parameterar
nConnectionBacklog
Den maximala längden som kön med väntande anslutningar kan utökas till. Giltigt intervall är mellan 1 och 5.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEADDRINUSEEtt försök har gjorts att lyssna på en adress som används.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEINVALSocketen har inte bundits medBindeller är redan ansluten.WSAEISCONNSocketen är redan ansluten.WSAEMFILEInga fler filbeskrivningar är tillgängliga.WSAENOBUFSDet finns inget buffertutrymme.WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPDen refererade socketen är inte av en typ som stöder åtgärdenListen.
Anmärkningar
För att acceptera anslutningar skapas socketen först med Create, en kvarvarande post för inkommande anslutningar anges med Listenoch sedan godkänns anslutningarna med Accept.
Listen gäller endast för socketar som stöder anslutningar, dvs. sådana av typen SOCK_STREAM. Den här socketen försätts i "passivt" läge där inkommande anslutningar bekräftas och placeras i kö i väntan på godkännande av processen.
Den här funktionen används vanligtvis av servrar (eller alla program som vill acceptera anslutningar) som kan ha fler än en anslutningsbegäran åt gången: om en anslutningsbegäran kommer med kön full får klienten ett fel med en indikation på WSAECONNREFUSED.
Listen försök att fortsätta att fungera rationellt när det inte finns några tillgängliga portar (deskriptorer). Den accepterar anslutningar tills kön töms. Om portar blir tillgängliga, kommer ett senare anrop till Listen eller Accept fyller på kön till den aktuella eller senaste "kvarvarande informationen", om möjligt, och återupptar lyssningen efter inkommande anslutningar.
CAsyncSocket::m_hSocket
Innehåller SOCKET handtaget för socketen som kapslas in av det här CAsyncSocket objektet.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Anropas av ramverket för att meddela en lyssnande socket att den kan acceptera väntande anslutningsbegäranden genom att anropa Accept medlemsfunktionen.
virtual void OnAccept(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnAccept medlemsfunktionen:
0 Funktionen har körts.
WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.
Anmärkningar
Mer information finns i Windows Sockets: Socket-meddelanden.
CAsyncSocket::OnClose
Anropas av ramverket för att meddela den här socketen att den anslutna socketen stängs av processen.
virtual void OnClose(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnClose medlemsfunktionen:
0 Funktionen har körts.
WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAECONNRESETAnslutningen återställdes av fjärrsidan.WSAECONNABORTEDAnslutningen avbröts på grund av timeout eller annat fel.
Anmärkningar
Mer information finns i Windows Sockets: Socket-meddelanden.
CAsyncSocket::OnConnect
Anropas av ramverket för att meddela den här anslutningssocketen att anslutningsförsöket har slutförts, oavsett om det är korrekt eller i fel.
virtual void OnConnect(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnConnect medlemsfunktionen:
0 Funktionen har körts.
WSAEADDRINUSEDen angivna adressen används redan.WSAEADDRNOTAVAILDen angivna adressen är inte tillgänglig från den lokala datorn.WSAEAFNOSUPPORTAdresser i den angivna familjen kan inte användas med den här socketen.WSAECONNREFUSEDAnslutningsförsöket avvisades med kraft.WSAEDESTADDRREQEn måladress krävs.WSAEFAULTArgumentetlpSockAddrLenär felaktigt.WSAEINVALSocketen är redan bunden till en adress.WSAEISCONNSocketen är redan ansluten.WSAEMFILEInga fler filbeskrivningar är tillgängliga.WSAENETUNREACHDet går inte att nå nätverket från den här värden just nu.WSAENOBUFSDet finns inget buffertutrymme. Det går inte att ansluta socketen.WSAENOTCONNSocketen är inte ansluten.WSAENOTSOCKBeskrivningen är en fil, inte en socket.WSAETIMEDOUTTidsgränsen för anslutningsförsöket uppstod utan att upprätta en anslutning.
Anmärkningar
Anmärkning
I CSocketanropas OnConnect aldrig meddelandefunktionen. För anslutningar anropar Connectdu bara , som returneras när anslutningen har slutförts (antingen korrekt eller i fel). Hur anslutningsmeddelanden hanteras är en MFC-implementeringsinformation.
Mer information finns i Windows Sockets: Socket-meddelanden.
Exempel
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
Anropas av ramverket för att meddela den mottagande socketen att den sändande socketen har out-of-band-data att skicka.
virtual void OnOutOfBandData(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnOutOfBandData medlemsfunktionen:
0 Funktionen har körts.
WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.
Anmärkningar
Out-of-band-data är en logiskt oberoende kanal som är associerad med varje par med anslutna socketar av typen SOCK_STREAM. Kanalen används vanligtvis för att skicka brådskande data.
MFC stöder out-of-band-data, men användare av klassen CAsyncSocket avråder från att använda dem. Det enklare sättet är att skapa en andra socket för att skicka sådana data. Mer information om out-of-band-data finns i Windows Sockets: Socket-meddelanden.
CAsyncSocket::OnReceive
Anropas av ramverket för att meddela den här socketen att det finns data i bufferten som kan hämtas genom att anropa Receive medlemsfunktionen.
virtual void OnReceive(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnReceive medlemsfunktionen:
0 Funktionen har körts.
WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.
Anmärkningar
Mer information finns i Windows Sockets: Socket-meddelanden.
Exempel
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
Anropas av ramverket för att meddela socketen att den nu kan skicka data genom att anropa Send medlemsfunktionen.
virtual void OnSend(int nErrorCode);
Parameterar
nErrorCode
Det senaste felet på en socket. Följande felkoder gäller för OnSend medlemsfunktionen:
0 Funktionen har körts.
WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.
Anmärkningar
Mer information finns i Windows Sockets: Socket-meddelanden.
Exempel
// 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 =
Tilldelar ett nytt värde till ett CAsyncSocket objekt.
void operator=(const CAsyncSocket& rSrc);
Parameterar
rSrc
En referens till ett befintligt CAsyncSocket objekt.
Anmärkningar
Anropa den här funktionen för att kopiera ett befintligt CAsyncSocket objekt till ett annat CAsyncSocket objekt.
CAsyncSocket::operator SOCKET
Använd den här operatorn för att hämta SOCKET objektets CAsyncSocket handtag.
operator SOCKET() const;
Returvärde
Om det lyckas hanterar du SOCKET objektet, annars NULL.
Anmärkningar
Du kan använda handtaget för att anropa Windows-API:er direkt.
CAsyncSocket::Receive
Anropa den här medlemsfunktionen för att ta emot data från en socket.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameterar
lpBuf
En buffert för inkommande data.
nBufLen
Längden på lpBuf i byte.
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_PEEKTitta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.MSG_OOBBearbeta out-of-band-data.
Returvärde
Om inget fel inträffar Receive returnerar antalet mottagna byte. Om anslutningen har stängts returneras 0. Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAENOTCONNSocketen är inte ansluten.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaReceiveen socket närShutDownhar anropats mednHowvärdet 0 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och åtgärdenReceiveskulle blockeras.WSAEMSGSIZEDatagrammet var för stort för att passa in i den angivna bufferten och trunkerades.WSAEINVALSocketen har inte bundits medBind.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.
Anmärkningar
Den här funktionen används för anslutna ström- eller datagramsocketer och används för att läsa inkommande data.
För sockets av typen SOCK_STREAMreturneras så mycket information som för närvarande är tillgänglig upp till storleken på den angivna bufferten. Om socketen har konfigurerats för in-line mottagning av out-of-band-data (socketalternativ SO_OOBINLINE) och out-of-band-data är olästa, returneras endast out-of-band-data. Programmet kan använda alternativet IOCtlSIOCATMARK eller OnOutOfBandData för att avgöra om fler out-of-band-data ska läsas.
För datagram-socketar extraheras data från det första kodade datagrammet, upp till storleken på bufferten som tillhandahålls. Om datagrammet är större än bufferten som anges fylls bufferten med den första delen av datagrammet, överskottsdata går förlorade och Receive returnerar värdet SOCKET_ERROR med felkoden inställd på WSAEMSGSIZE. Om det inte finns några inkommande data i socketen returneras värdet SOCKET_ERROR för med felkoden inställd på WSAEWOULDBLOCK. Återanropsfunktionen OnReceive kan användas för att avgöra när mer data kommer.
Om socketen är av typen SOCK_STREAM och fjärrsidan har stängt av anslutningen korrekt, slutförs en Receive omedelbart med 0 byte mottagna. Om anslutningen har återställts misslyckas en Receive med felet WSAECONNRESET.
Receive ska anropas bara en gång för varje gång CAsyncSocket::OnReceive anropas.
Exempel
Se exemplet för CAsyncSocket::OnReceive.
CAsyncSocket::ReceiveFrom
Anropa den här medlemsfunktionen för att ta emot ett datagram och lagra källadressen SOCKADDR i strukturen eller i 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);
Parameterar
lpBuf
En buffert för inkommande data.
nBufLen
Längden på lpBuf i byte.
rSocketAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rSocketPort
Referens till en UINT som lagrar en port.
lpSockAddr
En pekare till en SOCKADDR struktur som innehåller källadressen vid returen.
lpSockAddrLen
En pekare till källadressens längd i lpSockAddr byte.
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_PEEKTitta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.MSG_OOBBearbeta out-of-band-data.
Returvärde
Om inget fel inträffar ReceiveFrom returnerar antalet mottagna byte. Om anslutningen har stängts returneras 0. Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenvar ogiltigt: buffertenlpSockAddrvar för liten för att rymma peer-adressen.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEINVALSocketen har inte bundits medBind.WSAENOTCONNSocketen är inte ansluten (SOCK_STREAMendast).WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaReceiveFromen socket närShutDownhar anropats mednHowvärdet 0 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och åtgärdenReceiveFromskulle blockeras.WSAEMSGSIZEDatagrammet var för stort för att passa in i den angivna bufferten och trunkerades.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.
Anmärkningar
Den här funktionen används för att läsa inkommande data på en (eventuellt ansluten) socket och avbilda adressen som data skickades från.
Om du vill hantera IPv6-adresser använder du CAsyncSocket::ReceiveFromEx.
För sockets av typen SOCK_STREAMreturneras så mycket information som för närvarande är tillgänglig upp till storleken på den angivna bufferten. Om socketen har konfigurerats för in-line mottagning av out-of-band-data (socketalternativ SO_OOBINLINE) och out-of-band-data är olästa, returneras endast out-of-band-data. Programmet kan använda alternativet IOCtlSIOCATMARK eller OnOutOfBandData för att avgöra om fler out-of-band-data ska läsas. Parametrarna lpSockAddr och lpSockAddrLen ignoreras för SOCK_STREAM sockets.
För datagram-socketar extraheras data från det första kodade datagrammet, upp till storleken på bufferten som tillhandahålls. Om datagrammet är större än bufferten som anges fylls bufferten med den första delen av meddelandet, överskottsdata går förlorade och ReceiveFrom returnerar ett värde för SOCKET_ERROR med felkoden inställd på WSAEMSGSIZE.
Om lpSockAddr är nonzero och socketen är av typen SOCK_DGRAMkopieras nätverksadressen för socketen som skickade data till motsvarande SOCKADDR struktur. Värdet som pekas på av lpSockAddrLen initieras till storleken på den här strukturen och ändras när det returneras för att ange den faktiska storleken på den adress som lagras där. Om inga inkommande data är tillgängliga i socketen ReceiveFrom väntar samtalet på att data ska tas emot om inte socketen inte blockeras. I det här fallet returneras ett värde SOCKET_ERROR för med felkoden inställd på WSAEWOULDBLOCK. Återanropet OnReceive kan användas för att avgöra när mer data kommer.
Om socketen är av typen SOCK_STREAM och fjärrsidan har stängt av anslutningen korrekt, slutförs en ReceiveFrom omedelbart med 0 byte mottagna.
CAsyncSocket::ReceiveFromEx
Anropa den här medlemsfunktionen för att ta emot ett datagram och lagra källadressen SOCKADDR i strukturen eller i rSocketAddress (hanterar IPv6-adresser).
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parameterar
lpBuf
En buffert för inkommande data.
nBufLen
Längden på lpBuf i byte.
rSocketAddress
Referens till ett CString objekt som tar emot en streckad nummer-IP-adress.
rSocketPort
Referens till en UINT som lagrar en port.
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_PEEKTitta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.MSG_OOBBearbeta out-of-band-data.
Returvärde
Om inget fel inträffar ReceiveFromEx returnerar antalet mottagna byte. Om anslutningen har stängts returneras 0. Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTArgumentetlpSockAddrLenvar ogiltigt: buffertenlpSockAddrvar för liten för att rymma peer-adressen.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEINVALSocketen har inte bundits medBind.WSAENOTCONNSocketen är inte ansluten (SOCK_STREAMendast).WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaReceiveFromExen socket närShutDownhar anropats mednHowvärdet 0 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och åtgärdenReceiveFromExskulle blockeras.WSAEMSGSIZEDatagrammet var för stort för att passa in i den angivna bufferten och trunkerades.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.
Anmärkningar
Den här funktionen används för att läsa inkommande data på en (eventuellt ansluten) socket och avbilda adressen som data skickades från.
Den här funktionen är densamma som CAsyncSocket::ReceiveFrom förutom att den hanterar IPv6-adresser och äldre protokoll.
För sockets av typen SOCK_STREAMreturneras så mycket information som för närvarande är tillgänglig upp till storleken på den angivna bufferten. Om socketen har konfigurerats för in-line mottagning av out-of-band-data (socketalternativ SO_OOBINLINE) och out-of-band-data är olästa, returneras endast out-of-band-data. Programmet kan använda alternativet IOCtlSIOCATMARK eller OnOutOfBandData för att avgöra om fler out-of-band-data ska läsas. Parametrarna lpSockAddr och lpSockAddrLen ignoreras för SOCK_STREAM sockets.
För datagram-socketar extraheras data från det första kodade datagrammet, upp till storleken på bufferten som tillhandahålls. Om datagrammet är större än bufferten som anges fylls bufferten med den första delen av meddelandet, överskottsdata går förlorade och ReceiveFromEx returnerar ett värde för SOCKET_ERROR med felkoden inställd på WSAEMSGSIZE.
Om lpSockAddr är nonzero och socketen är av typen SOCK_DGRAMkopieras nätverksadressen för socketen som skickade data till motsvarande SOCKADDR struktur. Värdet som pekas på av lpSockAddrLen initieras till storleken på den här strukturen och ändras när det returneras för att ange den faktiska storleken på den adress som lagras där. Om inga inkommande data är tillgängliga i socketen ReceiveFromEx väntar samtalet på att data ska tas emot om inte socketen inte blockeras. I det här fallet returneras ett värde SOCKET_ERROR för med felkoden inställd på WSAEWOULDBLOCK. Återanropet OnReceive kan användas för att avgöra när mer data kommer.
Om socketen är av typen SOCK_STREAM och fjärrsidan har stängt av anslutningen korrekt, slutförs en ReceiveFromEx omedelbart med 0 byte mottagna.
CAsyncSocket::Send
Anropa den här medlemsfunktionen för att skicka data på en ansluten socket.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameterar
lpBuf
En buffert som innehåller de data som ska överföras.
nBufLen
Längden på data i lpBuf byte.
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_DONTROUTEAnger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.MSG_OOBSkicka out-of-band-data (SOCK_STREAMendast).
Returvärde
Om inget fel inträffar Send returnerar det totala antalet tecken som skickats. (Observera att detta kan vara mindre än det tal som anges av nBufLen.) Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEACCESDen begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEFAULTArgumentetlpBuffinns inte i en giltig del av användaradressutrymmet.WSAENETRESETAnslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.WSAENOBUFSImplementeringen av Windows Sockets rapporterar ett buffertlås.WSAENOTCONNSocketen är inte ansluten.WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaSenden socket närShutDownhar anropats mednHowvärdet 1 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.WSAEMSGSIZESocketen är av typenSOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.WSAEINVALSocketen har inte bundits medBind.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.
Anmärkningar
Send används för att skriva utgående data på ansluten ström eller datagram sockets. För datagram-socketar måste man vara noga med att inte överskrida den maximala IP-paketstorleken för de underliggande undernäten, vilket anges av elementet iMaxUdpDg i strukturen WSADATA som returneras av AfxSocketInit. Om data är för långa för att kunna passera atomiskt genom det underliggande protokollet returneras felet WSAEMSGSIZE via GetLastErroroch inga data överförs.
Observera att ett lyckat slutförande av ett Send datagram för ett datagram inte tyder på att data har levererats.
På CAsyncSocket objekt av typen SOCK_STREAMkan antalet skrivna byte vara mellan 1 och den begärda längden, beroende på bufferttillgänglighet på både lokala och externa värdar.
Exempel
Se exemplet för CAsyncSocket::OnSend.
CAsyncSocket::SendTo
Anropa den här medlemsfunktionen för att skicka data till ett specifikt mål.
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);
Parameterar
lpBuf
En buffert som innehåller de data som ska överföras.
nBufLen
Längden på data i lpBuf byte.
nHostPort
Porten som identifierar socket-programmet.
lpszHostAddress
Nätverksadressen för socketen som det här objektet är anslutet till: ett datornamn som "ftp.microsoft.com" eller ett prickat tal som "128.56.22.8".
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_DONTROUTEAnger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.MSG_OOBSkicka out-of-band-data (SOCK_STREAMendast).
lpSockAddr
En pekare till en SOCKADDR struktur som innehåller adressen till mål-socketen.
nSockAddrLen
Längden på adressen i lpSockAddr byte.
Returvärde
Om inget fel inträffar SendTo returnerar det totala antalet tecken som skickats. (Observera att detta kan vara mindre än det tal som anges av nBufLen.) Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEACCESDen begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEFAULTParametrarnalpBufellerlpSockAddrär inte en del av användarens adressutrymme, ellerlpSockAddrså är argumentet för litet (mindre än storleken på enSOCKADDRstruktur).WSAEINVALVärdnamnet är ogiltigt.WSAENETRESETAnslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.WSAENOBUFSImplementeringen av Windows Sockets rapporterar ett buffertlås.WSAENOTCONNSocketen är inte ansluten (SOCK_STREAMendast).WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaSendToen socket närShutDownhar anropats mednHowvärdet 1 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.WSAEMSGSIZESocketen är av typenSOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.WSAEADDRNOTAVAILDen angivna adressen är inte tillgänglig från den lokala datorn.WSAEAFNOSUPPORTAdresser i den angivna familjen kan inte användas med den här socketen.WSAEDESTADDRREQEn måladress krävs.WSAENETUNREACHDet går inte att nå nätverket från den här värden just nu.
Anmärkningar
SendTo används på datagram eller strömuttag och används för att skriva utgående data på en socket. För datagram-socketar måste man vara noga med att inte överskrida den maximala IP-paketstorleken för de underliggande undernäten, vilket anges av elementet iMaxUdpDg i strukturen som fylls i WSADATA av AfxSocketInit. Om data är för långa för att kunna passera atomiskt genom det underliggande protokollet returneras felet WSAEMSGSIZE och inga data överförs.
Observera att slutförandet av en SendTo inte tyder på att data har levererats.
SendTo används endast på en SOCK_DGRAM socket för att skicka ett datagram till en specifik socket som identifieras av parametern lpSockAddr .
Om du vill skicka en sändning (endast på en SOCK_DGRAM ) ska adressen i parametern lpSockAddr konstrueras med hjälp av den särskilda IP-adressen INADDR_BROADCAST (definierad i Windows Sockets-huvudfilen WINSOCK.H) tillsammans med det avsedda portnumret. Eller, om parametern lpszHostAddress är NULL, är socketen konfigurerad för sändning. Det är i allmänhet olämpligt att ett broadcast-datagram överskrider den storlek där fragmentering kan ske, vilket innebär att datadelen av datagrammet (exklusive rubriker) inte får överstiga 512 byte.
Om du vill hantera IPv6-adresser använder du CAsyncSocket::SendToEx.
CAsyncSocket::SendToEx
Anropa den här medlemsfunktionen för att skicka data till ett specifikt mål (hanterar IPv6-adresser).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parameterar
lpBuf
En buffert som innehåller de data som ska överföras.
nBufLen
Längden på data i lpBuf byte.
nHostPort
Porten som identifierar socket-programmet.
lpszHostAddress
Nätverksadressen för socketen som det här objektet är anslutet till: ett datornamn som "ftp.microsoft.com" eller ett prickat tal som "128.56.22.8".
nFlags
Anger hur anropet görs. Semantiken för den här funktionen bestäms av socketalternativen och parametern nFlags . Det senare konstrueras genom att kombinera något av följande värden med C++ bitvis OR-operatorn (|):
MSG_DONTROUTEAnger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.MSG_OOBSkicka out-of-band-data (SOCK_STREAMendast).
Returvärde
Om inget fel inträffar SendToEx returnerar det totala antalet tecken som skickats. (Observera att detta kan vara mindre än det tal som anges av nBufLen.) Annars returneras ett värde för SOCKET_ERROR och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEACCESDen begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEFAULTParametrarnalpBufellerlpSockAddrär inte en del av användarens adressutrymme, ellerlpSockAddrså är argumentet för litet (mindre än storleken på enSOCKADDRstruktur).WSAEINVALVärdnamnet är ogiltigt.WSAENETRESETAnslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.WSAENOBUFSImplementeringen av Windows Sockets rapporterar ett buffertlås.WSAENOTCONNSocketen är inte ansluten (SOCK_STREAMendast).WSAENOTSOCKBeskrivningen är inte en socket.WSAEOPNOTSUPPMSG_OOBhar angetts, men socketen är inte av typenSOCK_STREAM.WSAESHUTDOWNUttaget har stängts av. det går inte att anropaSendToExen socket närShutDownhar anropats mednHowvärdet 1 eller 2.WSAEWOULDBLOCKSocketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.WSAEMSGSIZESocketen är av typenSOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.WSAECONNABORTEDDen virtuella kretsen avbröts på grund av timeout eller annat fel.WSAECONNRESETDen virtuella kretsen återställdes av fjärrsidan.WSAEADDRNOTAVAILDen angivna adressen är inte tillgänglig från den lokala datorn.WSAEAFNOSUPPORTAdresser i den angivna familjen kan inte användas med den här socketen.WSAEDESTADDRREQEn måladress krävs.WSAENETUNREACHDet går inte att nå nätverket från den här värden just nu.
Anmärkningar
Den här metoden är samma som CAsyncSocket::SendTo förutom att den hanterar IPv6-adresser och äldre protokoll.
SendToEx används på datagram eller strömuttag och används för att skriva utgående data på en socket. För datagram-socketar måste man vara noga med att inte överskrida den maximala IP-paketstorleken för de underliggande undernäten, vilket anges av elementet iMaxUdpDg i strukturen som fylls i WSADATA av AfxSocketInit. Om data är för långa för att kunna passera atomiskt genom det underliggande protokollet returneras felet WSAEMSGSIZE och inga data överförs.
Observera att slutförandet av en SendToEx inte tyder på att data har levererats.
SendToEx används endast på en SOCK_DGRAM socket för att skicka ett datagram till en specifik socket som identifieras av parametern lpSockAddr .
Om du vill skicka en sändning (endast på en SOCK_DGRAM ) ska adressen i parametern lpSockAddr konstrueras med hjälp av den särskilda IP-adressen INADDR_BROADCAST (definierad i Windows Sockets-huvudfilen WINSOCK.H) tillsammans med det avsedda portnumret. Eller, om parametern lpszHostAddress är NULL, är socketen konfigurerad för sändning. Det är i allmänhet olämpligt att ett broadcast-datagram överskrider den storlek där fragmentering kan ske, vilket innebär att datadelen av datagrammet (exklusive rubriker) inte får överstiga 512 byte.
CAsyncSocket::SetSockOpt
Anropa den här medlemsfunktionen för att ange ett socketalternativ.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parameterar
nOptionName
Socket-alternativet som värdet ska anges för.
lpOptionValue
En pekare till bufferten där värdet för det begärda alternativet anges.
nOptionLen
Storleken på bufferten lpOptionValue i byte.
nLevel
Den nivå där alternativet definieras. de enda nivåerna som stöds är SOL_SOCKET och IPPROTO_TCP.
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEFAULTlpOptionValueär inte i en giltig del av processadressutrymmet.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAEINVALnLevelär ogiltigt eller så är informationen ilpOptionValueinte giltig.WSAENETRESETAnslutningen har överskriden tidsgräns närSO_KEEPALIVEden har angetts.WSAENOPROTOOPTAlternativet är okänt eller stöds inte. I synnerhetSO_BROADCASTstöds inte på socketar av typenSOCK_STREAM, medanSO_DONTLINGER,SO_KEEPALIVE,SO_LINGERochSO_OOBINLINEinte stöds på socketar av typenSOCK_DGRAM.WSAENOTCONNAnslutningen har återställts närSO_KEEPALIVEden har angetts.WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
SetSockOpt anger det aktuella värdet för ett socketalternativ som är associerat med en socket av valfri typ, i alla tillstånd. Även om det finns alternativ på flera protokollnivåer definierar den här specifikationen endast alternativ som finns på den översta "socket"-nivån. Alternativen påverkar socketåtgärder, till exempel om snabba data tas emot i den normala dataströmmen, om sändningsmeddelanden kan skickas i socketen och så vidare.
Det finns två typer av socketalternativ: Booleska alternativ som aktiverar eller inaktiverar en funktion eller ett beteende och alternativ som kräver ett heltalsvärde eller en struktur. Om du vill aktivera ett booleskt alternativ lpOptionValue pekar du på ett heltal som inte är noll. Om du vill inaktivera alternativet lpOptionValue pekar på ett heltal som är lika med noll.
nOptionLen ska vara lika med sizeof(BOOL) för booleska alternativ. För andra alternativ lpOptionValue pekar på heltal eller struktur som innehåller önskat värde för alternativet och nOptionLen är längden på heltal eller struktur.
SO_LINGER styr den åtgärd som vidtas när osedda data placeras i kö på en socket och Close funktionen anropas för att stänga socketen.
Som standard kan en socket inte bindas (se Bind) till en lokal adress som redan används. Ibland kan det dock vara önskvärt att "återanvända" en adress på det här sättet. Eftersom varje anslutning identifieras unikt genom kombinationen av lokala adresser och fjärradresser är det inga problem med att ha två sockets bundna till samma lokala adress så länge fjärradresserna är olika.
För att informera Windows Sockets-implementeringen om att ett Bind anrop på en socket inte ska tillåtas eftersom den önskade adressen redan används av en annan socket, bör programmet ange SO_REUSEADDR socketalternativet för socketen innan anropet Bind utfärdas. Observera att alternativet endast tolkas vid tidpunkten för anropet Bind : det är därför onödigt (men ofarligt) att ange alternativet på en socket som inte ska bindas till en befintlig adress och ställa in eller återställa alternativet när anropet Bind inte har någon effekt på den här eller någon annan socket.
Ett program kan begära att Windows Sockets-implementeringen möjliggör användning av "keep-alive"-paket på TCP-anslutningar (Transmission Control Protocol) genom att aktivera socketalternativet SO_KEEPALIVE . En Implementering av Windows Sockets behöver inte stödja användning av keep-alives: om den gör det är de exakta semantiken implementeringsspecifika, men bör överensstämma med avsnitt 4.2.3.6 i RFC 1122: "Krav för Internetvärdar – kommunikationslager". Om en anslutning tas bort till följd av "keep-alives" returneras felkoden WSAENETRESET till alla pågående anrop i socketen, och efterföljande anrop misslyckas med WSAENOTCONN.
Alternativet TCP_NODELAY inaktiverar Nagle-algoritmen. Nagle-algoritmen används för att minska antalet små paket som skickas av en värd genom att buffring av obemärkta sändningsdata tills ett fullstort paket kan skickas. Men för vissa program kan den här algoritmen hindra prestanda och TCP_NODELAY kan användas för att stänga av den. Programskrivare bör inte ställas in TCP_NODELAY om inte effekten av att göra det är väl förstådd och önskad, eftersom inställningen TCP_NODELAY kan ha en betydande negativ inverkan på nätverksprestanda.
TCP_NODELAY är det enda socketalternativ som stöds som använder nivån IPPROTO_TCP. Alla andra alternativ använder nivån SOL_SOCKET.
Vissa implementeringar av Windows Sockets tillhandahåller felsökningsinformation för utdata om SO_DEBUG alternativet anges av ett program.
Följande alternativ stöds för SetSockOpt. Typen identifierar den typ av data som adresseras av lpOptionValue.
| Värde | Typ | Innebörd |
|---|---|---|
SO_BROADCAST |
BOOL |
Tillåt överföring av sändningsmeddelanden i socketen. |
SO_DEBUG |
BOOL |
Registrera felsökningsinformation. |
SO_DONTLINGER |
BOOL |
Blockera Close inte väntan på att osedda data ska skickas. Att ange det här alternativet motsvarar inställningen SO_LINGER med l_onoff värdet noll. |
SO_DONTROUTE |
BOOL |
Dirigera inte: skicka direkt till gränssnittet. |
SO_KEEPALIVE |
BOOL |
Skicka keep-alives. |
SO_LINGER |
struct LINGER |
Dröj kvar om Close det finns data som inte har angetts. |
SO_OOBINLINE |
BOOL |
Ta emot out-of-band-data i den normala dataströmmen. |
SO_RCVBUF |
int |
Ange buffertstorlek för mottagningar. |
SO_REUSEADDR |
BOOL |
Tillåt att socketen är bunden till en adress som redan används. (Se Bindning.) |
SO_SNDBUF |
int |
Ange buffertstorlek för skickar. |
TCP_NODELAY |
BOOL |
Inaktiverar Nagle-algoritmen för sammankoppling av meddelanden. |
Alternativ för Berkeley Software Distribution (BSD) som inte stöds för SetSockOpt är:
| Värde | Typ | Innebörd |
|---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket lyssnar |
SO_ERROR |
int |
Hämta felstatus och rensa. |
SO_RCVLOWAT |
int |
Ta emot lågvattenmärke. |
SO_RCVTIMEO |
int |
Tidsgräns för att ta emot |
SO_SNDLOWAT |
int |
Skicka lågvattenmärke. |
SO_SNDTIMEO |
int |
Skicka timeout. |
SO_TYPE |
int |
Typ av socket. |
IP_OPTIONS |
Ange alternativfältet i IP-huvudet. |
CAsyncSocket::ShutDown
Anropa den här medlemsfunktionen för att inaktivera skickar, tar emot eller båda i socketen.
BOOL ShutDown(int nHow = sends);
Parameterar
nHow
En flagga som beskriver vilka typer av åtgärder som inte längre tillåts med hjälp av följande uppräknade värden:
tar emot = 0
skickar = 1
båda = 2
Returvärde
Nonzero om funktionen lyckas; annars 0 och en specifik felkod kan hämtas genom att anropa GetLastError. Följande fel gäller för den här medlemsfunktionen:
WSANOTINITIALISEDEtt lyckatAfxSocketInitmåste inträffa innan du använder det här API:et.WSAENETDOWNImplementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.WSAEINVALnHowär ogiltigt.WSAEINPROGRESSEn blockerande Windows Sockets-åtgärd pågår.WSAENOTCONNSocketen är inte ansluten (SOCK_STREAMendast).WSAENOTSOCKBeskrivningen är inte en socket.
Anmärkningar
ShutDown används på alla typer av socketar för att inaktivera mottagning, överföring eller båda. Om nHow är 0 kommer efterföljande mottagningar på socketen inte att tillåtas. Detta påverkar inte de lägre protokollskikten.
För TCP (Transmission Control Protocol) ändras inte TCP-fönstret och inkommande data accepteras (men bekräftas inte) förrän fönstret är slut. För UDP (User Datagram Protocol) accepteras inkommande datagram och placeras i kö. I inget fall genereras ett ICMP-felpaket. Om nHow är 1 tillåts inte efterföljande sändningar. För TCP-socketar skickas en FIN. Inställningen nHow till 2 inaktiverar både skickar och tar emot enligt beskrivningen ovan.
Observera att ShutDown inte stänger socketen och att resurser som är anslutna till socketen inte frigörs förrän det anropas Close . Ett program bör inte förlita sig på att kunna återanvända en socket när den har stängts av. I synnerhet krävs inte en Windows Sockets-implementering för att stödja användningen av Connect på en sådan socket.
Exempel
Se exemplet för CAsyncSocket::OnReceive.
CASyncSocket::Socket
Allokerar ett sockethandtag.
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);
Parameterar
nSocketType
Anger SOCK_STREAM eller SOCK_DGRAM.
lEvent
En bitmask som anger en kombination av nätverkshändelser som programmet är intresserat av.
FD_READ: Vill få meddelande om läsberedskap.FD_WRITE: Vill ta emot meddelande om beredskap för att skriva.FD_OOB: Vill få ett meddelande om ankomsten av out-of-band-data.FD_ACCEPT: Vill ta emot meddelanden om inkommande anslutningar.FD_CONNECT: Vill ta emot meddelande om slutförd anslutning.FD_CLOSE: Vill ta emot meddelande om socketstängning.
nProtocolType
Protokoll som ska användas med socketen som är specifik för den angivna adressfamiljen.
nAddressFormat
Adressfamiljespecifikation.
Returvärde
Returnerar TRUE vid lyckat fel FALSE .
Anmärkningar
Den här metoden allokerar ett sockethandtag. Den anropar CAsyncSocket::Bind inte för att binda socketen till en angiven adress, så du måste anropa Bind senare för att binda socketen till en angiven adress. Du kan använda CAsyncSocket::SetSockOpt för att ange socketalternativet innan det är bundet.
Se även
CObject klass
hierarkidiagram
CSocket klass
CSocketFile klass