Dela via


CAsyncSocket-klass

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

CObject

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen är för litet (mindre än storleken på en SOCKADDR struktur).

  • WSAEINPROGRESS Ett blockerande Windows Sockets-anrop pågår.

  • WSAEINVAL Listen anropades inte innan det accepterades.

  • WSAEMFILE Kön är tom när den godkänns och det finns inga tillgängliga beskrivningar.

  • WSAENOBUFS Det finns inget buffertutrymme.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP Den refererade socketen är inte en typ som stöder anslutningsorienterad tjänst.

  • WSAEWOULDBLOCK Socketen ä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_READ Vill ta emot meddelande om beredskap för läsning.

  • FD_WRITE Vill få ett meddelande när data är tillgängliga för att läsas.

  • 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 få meddelande om anslutningsresultat.

  • FD_CLOSE Vill 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEINVAL Anger att en av de angivna parametrarna var ogiltig.

  • WSAEINPROGRESS En 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_READ Vill ta emot meddelande om beredskap för läsning.

  • FD_WRITE Vill få ett meddelande när data är tillgängliga för att läsas.

  • 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 få meddelande om anslutningsresultat.

  • FD_CLOSE Vill 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.

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEADDRINUSE Den angivna adressen används redan. (Se socketalternativet SO_REUSEADDR under SetSockOpt.)

  • WSAEFAULT Argumentet nSockAddrLen är för litet (mindre än storleken på en SOCKADDR struktur).

  • WSAEINPROGRESS Ett blockerande Windows Sockets-anrop pågår.

  • WSAEAFNOSUPPORT Den angivna adressfamiljen stöds inte av den här porten.

  • WSAEINVAL Socketen är redan bunden till en adress.

  • WSAENOBUFS Det finns inte tillräckligt med tillgängliga buffertar, för många anslutningar.

  • WSAENOTSOCK Beskrivningen ä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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEADDRINUSE Den angivna adressen används redan.

  • WSAEINPROGRESS Ett blockerande Windows Sockets-anrop pågår.

  • WSAEADDRNOTAVAIL Den angivna adressen är inte tillgänglig från den lokala datorn.

  • WSAEAFNOSUPPORT Adresser i den angivna familjen kan inte användas med den här socketen.

  • WSAECONNREFUSED Anslutningsförsöket avvisades.

  • WSAEDESTADDRREQ En måladress krävs.

  • WSAEFAULT Argumentet nSockAddrLen är felaktigt.

  • WSAEINVAL Ogiltig värdadress.

  • WSAEISCONN Socketen är redan ansluten.

  • WSAEMFILE Inga fler filbeskrivningar är tillgängliga.

  • WSAENETUNREACH Det går inte att nå nätverket från den här värden just nu.

  • WSAENOBUFS Det finns inget buffertutrymme. Det går inte att ansluta socketen.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAETIMEDOUT Försök att ansluta tidsgränsen för anslutningen utan att upprätta en anslutning.

  • WSAEWOULDBLOCK Socketen ä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_READ Vill ta emot meddelande om beredskap för läsning.

  • 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.

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEAFNOSUPPORT Den angivna adressfamiljen stöds inte.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEMFILE Inga fler filbeskrivningar är tillgängliga.

  • WSAENOBUFS Det finns inget buffertutrymme. Det går inte att skapa socketen.

  • WSAEPROTONOSUPPORT Den angivna porten stöds inte.

  • WSAEPROTOTYPE Den angivna porten är fel typ för den här socketen.

  • WSAESOCKTNOSUPPORT Den 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_STREAM Tillhandahåller sekvenserade, tillförlitliga, fullständiga duplex-, anslutningsbaserade byteströmmar. Använder TCP (Transmission Control Protocol) för Internetadressfamiljen.

  • SOCK_DGRAM Stö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 Accept använder en referens till ett nytt, tomt CSocket objekt som parameter. Du måste skapa det här objektet innan du anropar Accept. Tänk på att om det här socketobjektet hamnar utanför omfånget stängs anslutningen. Anropa Create inte 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_READ Vill ta emot meddelande om beredskap för läsning.

  • 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.

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen är inte tillräckligt stort.

  • WSAEINPROGRESS Ett blockerande Windows Sockets-anrop pågår.

  • WSAENOTCONN Socketen är inte ansluten.

  • WSAENOTSOCK Beskrivningen ä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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen är inte tillräckligt stort.

  • WSAEINPROGRESS Ett blockerande Windows Sockets-anrop pågår.

  • WSAENOTCONN Socketen är inte ansluten.

  • WSAENOTSOCK Beskrivningen ä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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen är inte tillräckligt stort.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEINVAL Socketen har inte bundits till en adress med Bind.

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen är inte tillräckligt stort.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEINVAL Socketen har inte bundits till en adress med Bind.

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpOptionLen var ogiltigt.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOPROTOOPT Alternativet är okänt eller stöds inte. I synnerhet SO_BROADCAST stöds inte på socketar av typen SOCK_STREAM, medan SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERoch SO_OOBINLINE inte stöds på socketar av typen SOCK_DGRAM.

  • WSAENOTSOCK Beskrivningen ä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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEINVAL lCommand är inte ett giltigt kommando, eller lpArgument är inte en acceptabel parameter för lCommand, eller så är kommandot inte tillämpligt för den typ av socket som anges.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOTSOCK Beskrivningen ä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:

  • FIONBIO Aktivera eller inaktivera icke-blockeringsläge på socketen. Parametern lpArgument pekar på en DWORD, som inte är noll om icke-blockeringsläget ska aktiveras och noll om det ska inaktiveras. Om AsyncSelect har utfärdats på en socket misslyckas alla försök att använda IOCtl för att ställa in socketen tillbaka till blockeringsläget med WSAEINVAL. För att ställa in socketen tillbaka till blockeringsläge och förhindra WSAEINVAL felet måste ett program först inaktivera AsyncSelect genom att anropa AsyncSelect med parametern lEvent lika med 0 och sedan anropa IOCtl.

  • FIONREAD Fastställ det maximala antalet byte som kan läsas med ett Receive anrop från den här socketen. Parametern lpArgument pekar på en DWORD där IOCtl resultatet lagras. Om den här socketen är av typen SOCK_STREAMFIONREAD returnerar den totala mängden data som kan läsas i en enda Receive. Detta är normalt samma som den totala mängden data som köas i socketen. Om den här socketen är av typen SOCK_DGRAMFIONREAD returnerar storleken på det första datagram som köas på socketen.

  • SIOCATMARK Avgör om alla out-of-band-data har lästs. Detta gäller endast för en socket av typen SOCK_STREAM som 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ästa Receive eller ReceiveFrom utförda på socketen hämtar en del eller alla data som föregår "mark". Programmet bör använda SIOCATMARK å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 en Receive eller ReceiveFrom aldrig kommer att blanda out-of-band och normala data i samma anrop.) Parametern lpArgument pekar på en DWORD där IOCtl resultatet 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEADDRINUSE Ett försök har gjorts att lyssna på en adress som används.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEINVAL Socketen har inte bundits med Bind eller är redan ansluten.

  • WSAEISCONN Socketen är redan ansluten.

  • WSAEMFILE Inga fler filbeskrivningar är tillgängliga.

  • WSAENOBUFS Det finns inget buffertutrymme.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP Den refererade socketen är inte av en typ som stöder åtgärden Listen .

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.

  • WSAENETDOWN Implementeringen 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.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAECONNRESET Anslutningen återställdes av fjärrsidan.

  • WSAECONNABORTED Anslutningen 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.

  • WSAEADDRINUSE Den angivna adressen används redan.

  • WSAEADDRNOTAVAIL Den angivna adressen är inte tillgänglig från den lokala datorn.

  • WSAEAFNOSUPPORT Adresser i den angivna familjen kan inte användas med den här socketen.

  • WSAECONNREFUSED Anslutningsförsöket avvisades med kraft.

  • WSAEDESTADDRREQ En måladress krävs.

  • WSAEFAULT Argumentet lpSockAddrLen är felaktigt.

  • WSAEINVAL Socketen är redan bunden till en adress.

  • WSAEISCONN Socketen är redan ansluten.

  • WSAEMFILE Inga fler filbeskrivningar är tillgängliga.

  • WSAENETUNREACH Det går inte att nå nätverket från den här värden just nu.

  • WSAENOBUFS Det finns inget buffertutrymme. Det går inte att ansluta socketen.

  • WSAENOTCONN Socketen är inte ansluten.

  • WSAENOTSOCK Beskrivningen är en fil, inte en socket.

  • WSAETIMEDOUT Tidsgrä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.

  • WSAENETDOWN Implementeringen 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.

  • WSAENETDOWN Implementeringen 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.

  • WSAENETDOWN Implementeringen 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_PEEK Titta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.

  • MSG_OOB Bearbeta 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAENOTCONN Socketen är inte ansluten.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa Receive en socket när ShutDown har anropats med nHow värdet 0 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och åtgärden Receive skulle blockeras.

  • WSAEMSGSIZE Datagrammet var för stort för att passa in i den angivna bufferten och trunkerades.

  • WSAEINVAL Socketen har inte bundits med Bind.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den 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_PEEK Titta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.

  • MSG_OOB Bearbeta 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen var ogiltigt: bufferten lpSockAddr var för liten för att rymma peer-adressen.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEINVAL Socketen har inte bundits med Bind.

  • WSAENOTCONN Socketen är inte ansluten (SOCK_STREAM endast).

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa ReceiveFrom en socket när ShutDown har anropats med nHow värdet 0 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och åtgärden ReceiveFrom skulle blockeras.

  • WSAEMSGSIZE Datagrammet var för stort för att passa in i den angivna bufferten och trunkerades.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den 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_PEEK Titta på inkommande data. Data kopieras till bufferten men tas inte bort från indatakön.

  • MSG_OOB Bearbeta 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT Argumentet lpSockAddrLen var ogiltigt: bufferten lpSockAddr var för liten för att rymma peer-adressen.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEINVAL Socketen har inte bundits med Bind.

  • WSAENOTCONN Socketen är inte ansluten (SOCK_STREAM endast).

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa ReceiveFromEx en socket när ShutDown har anropats med nHow värdet 0 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och åtgärden ReceiveFromEx skulle blockeras.

  • WSAEMSGSIZE Datagrammet var för stort för att passa in i den angivna bufferten och trunkerades.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den 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_DONTROUTE Anger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.

  • MSG_OOB Skicka out-of-band-data (SOCK_STREAM endast).

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEACCES Den begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEFAULT Argumentet lpBuf finns inte i en giltig del av användaradressutrymmet.

  • WSAENETRESET Anslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.

  • WSAENOBUFS Implementeringen av Windows Sockets rapporterar ett buffertlås.

  • WSAENOTCONN Socketen är inte ansluten.

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa Send en socket när ShutDown har anropats med nHow värdet 1 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.

  • WSAEMSGSIZE Socketen är av typen SOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.

  • WSAEINVAL Socketen har inte bundits med Bind.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den 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.

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_DONTROUTE Anger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.

  • MSG_OOB Skicka out-of-band-data (SOCK_STREAM endast).

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEACCES Den begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEFAULT Parametrarna lpBuf eller lpSockAddr är inte en del av användarens adressutrymme, eller lpSockAddr så är argumentet för litet (mindre än storleken på en SOCKADDR struktur).

  • WSAEINVAL Värdnamnet är ogiltigt.

  • WSAENETRESET Anslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.

  • WSAENOBUFS Implementeringen av Windows Sockets rapporterar ett buffertlås.

  • WSAENOTCONN Socketen är inte ansluten (SOCK_STREAM endast).

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa SendTo en socket när ShutDown har anropats med nHow värdet 1 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.

  • WSAEMSGSIZE Socketen är av typen SOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den virtuella kretsen återställdes av fjärrsidan.

  • WSAEADDRNOTAVAIL Den angivna adressen är inte tillgänglig från den lokala datorn.

  • WSAEAFNOSUPPORT Adresser i den angivna familjen kan inte användas med den här socketen.

  • WSAEDESTADDRREQ En måladress krävs.

  • WSAENETUNREACH Det 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_DONTROUTE Anger att data inte ska omfattas av routning. En Windows Sockets-leverantör kan välja att ignorera den här flaggan.

  • MSG_OOB Skicka out-of-band-data (SOCK_STREAM endast).

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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEACCES Den begärda adressen är en sändningsadress, men lämplig flagga har inte angetts.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEFAULT Parametrarna lpBuf eller lpSockAddr är inte en del av användarens adressutrymme, eller lpSockAddr så är argumentet för litet (mindre än storleken på en SOCKADDR struktur).

  • WSAEINVAL Värdnamnet är ogiltigt.

  • WSAENETRESET Anslutningen måste återställas eftersom Windows Sockets-implementeringen tog bort den.

  • WSAENOBUFS Implementeringen av Windows Sockets rapporterar ett buffertlås.

  • WSAENOTCONN Socketen är inte ansluten (SOCK_STREAM endast).

  • WSAENOTSOCK Beskrivningen är inte en socket.

  • WSAEOPNOTSUPP MSG_OOB har angetts, men socketen är inte av typen SOCK_STREAM.

  • WSAESHUTDOWN Uttaget har stängts av. det går inte att anropa SendToEx en socket när ShutDown har anropats med nHow värdet 1 eller 2.

  • WSAEWOULDBLOCK Socketen är markerad som icke-blockerande och den begärda åtgärden skulle blockeras.

  • WSAEMSGSIZE Socketen är av typen SOCK_DGRAMoch datagrammet är större än det högsta som stöds av Windows Sockets-implementeringen.

  • WSAECONNABORTED Den virtuella kretsen avbröts på grund av timeout eller annat fel.

  • WSAECONNRESET Den virtuella kretsen återställdes av fjärrsidan.

  • WSAEADDRNOTAVAIL Den angivna adressen är inte tillgänglig från den lokala datorn.

  • WSAEAFNOSUPPORT Adresser i den angivna familjen kan inte användas med den här socketen.

  • WSAEDESTADDRREQ En måladress krävs.

  • WSAENETUNREACH Det 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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEFAULT lpOptionValue är inte i en giltig del av processadressutrymmet.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAEINVAL nLevel är ogiltigt eller så är informationen i lpOptionValue inte giltig.

  • WSAENETRESET Anslutningen har överskriden tidsgräns när SO_KEEPALIVE den har angetts.

  • WSAENOPROTOOPT Alternativet är okänt eller stöds inte. I synnerhet SO_BROADCAST stöds inte på socketar av typen SOCK_STREAM, medan SO_DONTLINGER, SO_KEEPALIVE, SO_LINGERoch SO_OOBINLINE inte stöds på socketar av typen SOCK_DGRAM.

  • WSAENOTCONN Anslutningen har återställts när SO_KEEPALIVE den har angetts.

  • WSAENOTSOCK Beskrivningen ä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:

  • WSANOTINITIALISED Ett lyckat AfxSocketInit måste inträffa innan du använder det här API:et.

  • WSAENETDOWN Implementeringen av Windows Sockets upptäckte att nätverksundersystemet misslyckades.

  • WSAEINVAL nHow är ogiltigt.

  • WSAEINPROGRESS En blockerande Windows Sockets-åtgärd pågår.

  • WSAENOTCONN Socketen är inte ansluten (SOCK_STREAM endast).

  • WSAENOTSOCK Beskrivningen ä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