Condividi tramite


Classe CAsyncSocket

Rappresenta un socket di Windows: un endpoint di comunicazione di rete.

Sintassi

class CAsyncSocket : public CObject

Membri

Costruttori pubblici

Nome Descrizione
CAsyncSocket::CAsyncSocket Costruisce un oggetto CAsyncSocket.

Metodi pubblici

Nome Descrizione
CAsyncSocket::Accept Accetta una connessione sul socket.
CAsyncSocket::AsyncSelect Richiede la notifica degli eventi per il socket.
CAsyncSocket::Attach Collega un handle socket a un CAsyncSocket oggetto .
CAsyncSocket::Bind Associa un indirizzo locale al socket.
CAsyncSocket::Close Chiude il socket.
CAsyncSocket::Connect Stabilisce una connessione a un socket peer.
CAsyncSocket::Create Crea un socket.
CAsyncSocket::CreateEx Crea un socket con opzioni avanzate.
CAsyncSocket::Detach Scollega un handle socket da un CAsyncSocket oggetto .
CAsyncSocket::FromHandle Restituisce un puntatore a un CAsyncSocket oggetto, dato un handle socket.
CAsyncSocket::GetLastError Ottiene lo stato dell'errore per l'ultima operazione non riuscita.
CAsyncSocket::GetPeerName Ottiene l'indirizzo del socket peer a cui è connesso il socket.
CAsyncSocket::GetPeerNameEx Ottiene l'indirizzo del socket peer a cui è connesso il socket (gestisce gli indirizzi IPv6).
CAsyncSocket::GetSockName Ottiene il nome locale per un socket.
CAsyncSocket::GetSockNameEx Ottiene il nome locale per un socket (gestisce gli indirizzi IPv6).
CAsyncSocket::GetSockOpt Recupera un'opzione socket.
CAsyncSocket::IOCtl Controlla la modalità del socket.
CAsyncSocket::Listen Stabilisce un socket per l'ascolto delle richieste di connessione in ingresso.
CAsyncSocket::Receive Riceve i dati dal socket.
CAsyncSocket::ReceiveFrom Riceve un datagramma e archivia l'indirizzo di origine.
CAsyncSocket::ReceiveFromEx Riceve un datagramma e archivia l'indirizzo di origine (gestisce gli indirizzi IPv6).
CAsyncSocket::Send Invia i dati a un socket connesso.
CAsyncSocket::SendTo Invia dati a una destinazione specifica.
CAsyncSocket::SendToEx Invia dati a una destinazione specifica (gestisce gli indirizzi IPv6).
CAsyncSocket::SetSockOpt Imposta un'opzione socket.
CAsyncSocket::ShutDown Send Disabilita e/o Receive le chiamate sul socket.
CASyncSocket::Socket Alloca un handle socket.

Metodi protetti

Nome Descrizione
CAsyncSocket::OnAccept Notifica a un socket di ascolto che può accettare richieste di connessione in sospeso chiamando Accept.
CAsyncSocket::OnClose Notifica a un socket che il socket connesso a esso è chiuso.
CAsyncSocket::OnConnect Notifica a un socket di connessione che il tentativo di connessione è stato completato, sia che si verifichi un errore.
CAsyncSocket::OnOutOfBandData Notifica a un socket ricevente che sono presenti dati fuori banda da leggere sul socket, in genere un messaggio urgente.
CAsyncSocket::OnReceive Notifica a un socket di ascolto che sono presenti dati da recuperare chiamando Receive.
CAsyncSocket::OnSend Notifica a un socket che può inviare dati chiamando Send.

Operatori pubblici

Nome Descrizione
CAsyncSocket::operator = Assegna un nuovo valore a un CAsyncSocket oggetto .
CAsyncSocket::operator SOCKET Utilizzare questo operatore per recuperare l'handle SOCKET dell'oggetto CAsyncSocket .

Membri dati pubblici

Nome Descrizione
CAsyncSocket::m_hSocket Indica l'handle SOCKET associato a questo CAsyncSocket oggetto.

Osservazioni:

La classe CAsyncSocket incapsula l'API funzioni Di Windows Socket, fornendo un'astrazione orientata agli oggetti per i programmatori che vogliono usare Windows Socket in combinazione con MFC.

Questa classe si basa sul presupposto che si comprendano le comunicazioni di rete. L'utente è responsabile della gestione delle differenze di blocco, ordine dei byte e delle conversioni tra stringhe Unicode e multibyte character set (MBCS). Se si vuole un'interfaccia più comoda che gestisce questi problemi, vedere la classe CSocket.

Per usare un CAsyncSocket oggetto, chiamarne il costruttore, quindi chiamare la funzione per creare l'handle Create socket sottostante (tipo SOCKET), ad eccezione dei socket accettati. Per un socket del server chiamare la Listen funzione membro e per un socket client chiamare la Connect funzione membro. Il socket del server deve chiamare la Accept funzione quando riceve una richiesta di connessione. Usare le funzioni rimanenti CAsyncSocket per eseguire comunicazioni tra socket. Al termine, eliminare definitivamente l'oggetto CAsyncSocket se è stato creato nell'heap; il distruttore chiama automaticamente la Close funzione. Il SOCKET tipo di dati è descritto nell'articolo Windows Sockets: Background.

Nota

Quando si usano socket MFC in thread secondari in un'applicazione MFC collegata in modo statico, è necessario chiamare AfxSocketInit in ogni thread che usa socket per inizializzare le librerie socket. Per impostazione predefinita, AfxSocketInit viene chiamato solo nel thread primario.

Per altre informazioni, vedere Windows Sockets: Using Class (Uso della classe CAsyncSocket ) e degli articoli correlati., oltre all'API Windows Sockets 2.

Gerarchia di ereditarietà

CObject

CAsyncSocket

Requisiti

Intestazione:afxsock.h

CAsyncSocket::Accept

Chiamare questa funzione membro per accettare una connessione in un socket.

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

Parametri

rConnectedSocket
Riferimento che identifica un nuovo socket disponibile per la connessione.

lpSockAddr
Puntatore a una SOCKADDR struttura che riceve l'indirizzo del socket di connessione, noto sulla rete. Il formato esatto dell'argomento lpSockAddr è determinato dalla famiglia di indirizzi stabilita al momento della creazione del socket. Se lpSockAddr e/o lpSockAddrLen sono uguali a NULL, non vengono restituite informazioni sull'indirizzo remoto del socket accettato.

lpSockAddrLen
Puntatore alla lunghezza dell'indirizzo in lpSockAddr byte. lpSockAddrLen è un parametro value-result: deve inizialmente contenere la quantità di spazio a lpSockAddrcui punta ; in caso di restituzione conterrà la lunghezza effettiva (in byte) dell'indirizzo restituito.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen è troppo piccolo (minore delle dimensioni di una SOCKADDR struttura).

  • WSAEINPROGRESS È in corso una chiamata di Windows Sockets bloccante.

  • WSAEINVALListen non è stato richiamato prima di accettare.

  • WSAEMFILE La coda è vuota al momento dell'accettazione e non sono disponibili descrittori.

  • WSAENOBUFS Non è disponibile alcuno spazio nel buffer.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPP Il socket a cui si fa riferimento non è un tipo che supporta il servizio orientato alla connessione.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e non sono presenti connessioni da accettare.

Osservazioni:

Questa routine estrae la prima connessione nella coda di connessioni in sospeso, crea un nuovo socket con le stesse proprietà del socket e lo collega a rConnectedSocket. Se nella coda non sono presenti connessioni in sospeso, Accept restituisce zero e GetLastError restituisce un errore. Il socket accettato (rConnectedSocket) non può essere usato per accettare più connessioni. Il socket originale rimane aperto e in ascolto.

L'argomento lpSockAddr è un parametro di risultato compilato con l'indirizzo del socket di connessione, noto al livello di comunicazione. Accept viene usato con tipi di socket basati sulla connessione, ad SOCK_STREAMesempio .

CAsyncSocket::AsyncSelect

Chiamare questa funzione membro per richiedere la notifica degli eventi per un socket.

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

Parametri

lEvent
Maschera di bit che specifica una combinazione di eventi di rete in cui l'applicazione è interessata.

  • FD_READ Si vuole ricevere una notifica di idoneità per la lettura.

  • FD_WRITE Si vuole ricevere una notifica quando i dati sono disponibili per la lettura.

  • FD_OOB Si vuole ricevere una notifica dell'arrivo dei dati fuori banda.

  • FD_ACCEPT Si vuole ricevere una notifica delle connessioni in ingresso.

  • FD_CONNECT Si vuole ricevere una notifica dei risultati della connessione.

  • FD_CLOSE Si vuole ricevere una notifica quando un socket è stato chiuso da un peer.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEINVAL Indica che uno dei parametri specificati non è valido.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

Osservazioni:

Questa funzione viene usata per specificare quali funzioni di notifica del callback MFC verranno chiamate per il socket. AsyncSelect imposta automaticamente questo socket sulla modalità non bloccante. Per altre informazioni, vedere l'articolo Windows Sockets: Socket Notifications.For more information, see the article Windows Sockets: Socket Notifications.

CAsyncSocket::Attach

Chiamare questa funzione membro per collegare l'handle hSocket a un CAsyncSocket oggetto .

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

Parametri

hSocket
Contiene un handle per un socket.

lEvent
Maschera di bit che specifica una combinazione di eventi di rete in cui l'applicazione è interessata.

  • FD_READ Si vuole ricevere una notifica di idoneità per la lettura.

  • FD_WRITE Si vuole ricevere una notifica quando i dati sono disponibili per la lettura.

  • FD_OOB Si vuole ricevere una notifica dell'arrivo dei dati fuori banda.

  • FD_ACCEPT Si vuole ricevere una notifica delle connessioni in ingresso.

  • FD_CONNECT Si vuole ricevere una notifica dei risultati della connessione.

  • FD_CLOSE Si vuole ricevere una notifica quando un socket è stato chiuso da un peer.

Valore restituito

Diverso da zero se la funzione ha esito positivo.

Osservazioni:

L'handle SOCKET viene archiviato nel membro dati dell'oggetto m_hSocket .

CAsyncSocket::Bind

Chiamare questa funzione membro per associare un indirizzo locale al socket.

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

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

Parametri

nSocketPort
Porta che identifica l'applicazione socket.

lpszSocketAddress
Indirizzo di rete, un numero punteggiato, ad esempio "128.56.22.8". Passando la NULL stringa per questo parametro indica che l'istanza deve essere in ascolto dell'attività CAsyncSocket client in tutte le interfacce di rete.

lpSockAddr
Puntatore a una SOCKADDR struttura che contiene l'indirizzo da assegnare a questo socket.

nSockAddrLen
Lunghezza dell'indirizzo in lpSockAddr byte.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. L'elenco seguente illustra alcuni degli errori che potrebbero essere restituiti. Per un elenco completo, vedere Codici di errore di Windows Sockets.

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEADDRINUSE L'indirizzo specificato è già in uso. (Vedere l'opzione SO_REUSEADDR socket in SetSockOpt.)

  • WSAEFAULT L'argomento nSockAddrLen è troppo piccolo (minore delle dimensioni di una SOCKADDR struttura).

  • WSAEINPROGRESS È in corso una chiamata di Windows Sockets bloccante.

  • WSAEAFNOSUPPORT La famiglia di indirizzi specificata non è supportata da questa porta.

  • WSAEINVAL Il socket è già associato a un indirizzo.

  • WSAENOBUFS Buffer non sufficienti disponibili, troppe connessioni.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

Questa routine viene utilizzata su un datagramma o un socket di flusso non connesso, prima delle successive Connect chiamate o Listen . Prima di poter accettare le richieste di connessione, un socket del server in ascolto deve selezionare un numero di porta e renderlo noto a Windows Socket chiamando Bind. Bind stabilisce l'associazione locale (indirizzo host/numero di porta) del socket assegnando un nome locale a un socket senza nome.

CAsyncSocket::CAsyncSocket

Costruisce un oggetto socket vuoto.

CAsyncSocket();

Osservazioni:

Dopo aver costruito l'oggetto, è necessario chiamare la relativa Create funzione membro per creare la struttura dei dati e associarne l'indirizzo SOCKET . Sul lato server di una comunicazione di Windows Sockets, quando il socket di ascolto crea un socket da usare nella Accept chiamata, non si chiama Create per tale socket.

CAsyncSocket::Close

Chiude il socket.

virtual void Close();

Osservazioni:

Questa funzione rilascia il descrittore socket in modo che altri riferimenti a esso avranno esito negativo con l'errore WSAENOTSOCK. Se si tratta dell'ultimo riferimento al socket sottostante, le informazioni di denominazione associate e i dati in coda vengono eliminati. Il distruttore dell'oggetto socket chiama Close l'utente.

Per CAsyncSocket, ma non per CSocket, la semantica di Close è influenzata dalle opzioni SO_LINGER socket e SO_DONTLINGER. Per altre informazioni, vedere Funzione GetSockOptmembro .

CAsyncSocket::Connect

Chiamare questa funzione membro per stabilire una connessione a un flusso non connesso o a un socket di datagrammi.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

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

Parametri

lpszHostAddress
Indirizzo di rete del socket a cui è connesso l'oggetto: un nome del computer, ad esempio "ftp.microsoft.com" o un numero punteggiato, ad esempio "128.56.22.8".

nHostPort
Porta che identifica l'applicazione socket.

lpSockAddr
Puntatore a una SOCKADDR struttura che contiene l'indirizzo del socket connesso.

nSockAddrLen
Lunghezza dell'indirizzo in lpSockAddr byte.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Se indica un codice di errore di WSAEWOULDBLOCKe l'applicazione usa i callback sostituibili, l'applicazione riceverà un OnConnect messaggio al termine dell'operazione di connessione. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEADDRINUSE L'indirizzo specificato è già in uso.

  • WSAEINPROGRESS È in corso una chiamata di Windows Sockets bloccante.

  • WSAEADDRNOTAVAIL L'indirizzo specificato non è disponibile nel computer locale.

  • WSAEAFNOSUPPORT Gli indirizzi nella famiglia specificata non possono essere utilizzati con questo socket.

  • WSAECONNREFUSED Il tentativo di connessione è stato rifiutato.

  • WSAEDESTADDRREQ È necessario un indirizzo di destinazione.

  • WSAEFAULT L'argomento nSockAddrLen non è corretto.

  • WSAEINVAL Indirizzo host non valido.

  • WSAEISCONN Il socket è già connesso.

  • WSAEMFILE Non sono disponibili altri descrittori di file.

  • WSAENETUNREACH Impossibile raggiungere la rete da questo host al momento.

  • WSAENOBUFS Non è disponibile alcuno spazio nel buffer. Il socket non può essere collegato.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAETIMEDOUT Tentativo di connessione timeout senza stabilire una connessione.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e la connessione non può essere completata immediatamente.

Osservazioni:

Se il socket non è associato, i valori univoci vengono assegnati all'associazione locale dal sistema e il socket viene contrassegnato come associato. Si noti che se il campo dell'indirizzo della struttura del nome è tutti zero, Connect restituirà zero. Per ottenere informazioni estese sull'errore, chiamare la GetLastError funzione membro.

Per i socket di flusso (tipo SOCK_STREAM), viene avviata una connessione attiva all'host esterno. Al termine della chiamata socket, il socket è pronto per l'invio/ricezione dei dati.

Per un socket di datagrammi (tipo SOCK_DGRAM), viene impostata una destinazione predefinita, che verrà usata nelle chiamate successive Send e Receive .

CAsyncSocket::Create

Chiamare la Create funzione membro dopo aver costruito un oggetto socket per creare il socket di Windows e collegarlo.

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);

Parametri

nSocketPort
Porta nota da usare con il socket o 0 se si vuole che Windows Sockets selezioni una porta.

nSocketType
SOCK_STREAM o SOCK_DGRAM.

lEvent
Maschera di bit che specifica una combinazione di eventi di rete in cui l'applicazione è interessata.

  • FD_READ Si vuole ricevere una notifica di idoneità per la lettura.

  • FD_WRITE Si vuole ricevere una notifica di idoneità per la scrittura.

  • FD_OOB Si vuole ricevere una notifica dell'arrivo dei dati fuori banda.

  • FD_ACCEPT Si vuole ricevere una notifica delle connessioni in ingresso.

  • FD_CONNECT Si vuole ricevere la notifica della connessione completata.

  • FD_CLOSE Si vuole ricevere una notifica di chiusura del socket.

lpszSockAddress
Puntatore a una stringa contenente l'indirizzo di rete del socket connesso, un numero punteggiato, ad esempio "128.56.22.8". Passando la NULL stringa per questo parametro indica che l'istanza deve essere in ascolto dell'attività CAsyncSocket client in tutte le interfacce di rete.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEAFNOSUPPORT La famiglia di indirizzi specificata non è supportata.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEMFILE Non sono disponibili altri descrittori di file.

  • WSAENOBUFS Non è disponibile alcuno spazio nel buffer. Impossibile creare il socket.

  • WSAEPROTONOSUPPORT La porta specificata non è supportata.

  • WSAEPROTOTYPE La porta specificata è il tipo errato per questo socket.

  • WSAESOCKTNOSUPPORT Il tipo di socket specificato non è supportato in questa famiglia di indirizzi.

Osservazioni:

Create chiama Socket e, in caso di esito positivo, chiama Bind per associare il socket all'indirizzo specificato. Sono supportati i tipi di socket seguenti:

  • SOCK_STREAM Fornisce flussi di byte sequenziati, affidabili, full-duplex e basati sulla connessione. Usa il protocollo TCP (Transmission Control Protocol) per la famiglia di indirizzi Internet.

  • SOCK_DGRAM Supporta i datagrammi, che non sono connessioni, pacchetti inaffidabili di una lunghezza massima fissa (in genere piccola). Usa il protocollo UDP (User Datagram Protocol) per la famiglia di indirizzi Internet.

    Nota

    La Accept funzione membro accetta un riferimento a un nuovo oggetto vuoto CSocket come parametro. È necessario costruire questo oggetto prima di chiamare Accept. Tenere presente che se questo oggetto socket esce dall'ambito, la connessione si chiude. Non chiamare Create per questo nuovo oggetto socket.

Importante

Createnon è thread-safe. Se la si chiama in un ambiente multithread in cui potrebbe essere richiamata contemporaneamente da thread diversi, assicurarsi di proteggere ogni chiamata con un mutex o un altro blocco di sincronizzazione.

Per altre informazioni sui socket di flusso e di datagrammi, vedere gli articoli Windows Sockets: Background and Windows Sockets: Ports and SocketEs and Socketes and Windows Sockets 2 API (Windows Sockets: background e Windows Sockets: porte e socket di socket e API Windows Sockets 2).

CAsyncSocket::CreateEx

Chiamare la CreateEx funzione membro dopo aver costruito un oggetto socket per creare il socket di Windows e collegarlo.

Usare questa funzione quando è necessario fornire opzioni avanzate, ad esempio il tipo di socket.

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

Parametri

pAI
Puntatore a un ADDRINFOT oggetto per contenere informazioni sul socket, ad esempio la famiglia e il tipo di socket.

lEvent
Maschera di bit che specifica una combinazione di eventi di rete in cui l'applicazione è interessata.

  • FD_READ Si vuole ricevere una notifica di idoneità per la lettura.

  • FD_WRITE Si vuole ricevere una notifica di idoneità per la scrittura.

  • FD_OOB Si vuole ricevere una notifica dell'arrivo dei dati fuori banda.

  • FD_ACCEPT Si vuole ricevere una notifica delle connessioni in ingresso.

  • FD_CONNECT Si vuole ricevere la notifica della connessione completata.

  • FD_CLOSE Si vuole ricevere una notifica di chiusura del socket.

Valore restituito

Vedere il valore restituito per Create().

Osservazioni:

Vedere le osservazioni per Create().

CAsyncSocket::Detach

Chiamare questa funzione membro per scollegare l'handle SOCKET nel membro dati dall'oggetto CAsyncSocket e impostare su m_hSocketNULL.m_hSocket

SOCKET Detach();

CAsyncSocket::FromHandle

Restituisce un puntatore a un CAsyncSocket oggetto .

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parametri

hSocket
Contiene un handle per un socket.

Valore restituito

Puntatore a un CAsyncSocket oggetto o NULL se non è presente alcun CAsyncSocket oggetto associato a hSocket.

Osservazioni:

Se viene specificato un SOCKET handle, se un CAsyncSocket oggetto non è collegato all'handle, la funzione membro restituisce NULL.

CAsyncSocket::GetLastError

Chiamare questa funzione membro per ottenere lo stato di errore per l'ultima operazione non riuscita.

static int PASCAL GetLastError();

Valore restituito

Il valore restituito indica il codice di errore per l'ultima routine dell'API Windows Sockets eseguita da questo thread.

Osservazioni:

Quando una particolare funzione membro indica che si è verificato un errore, GetLastError deve essere chiamato per recuperare il codice di errore appropriato. Per un elenco dei codici di errore applicabili, vedere le descrizioni delle singole funzioni membro.

Per altre informazioni sui codici di errore, vedere API Windows Sockets 2.

CAsyncSocket::GetPeerName

Chiamare questa funzione membro per ottenere l'indirizzo del socket peer a cui è connesso questo socket.

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

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

Parametri

rPeerAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rPeerPort
Riferimento a un UINT oggetto che archivia una porta.

lpSockAddr
Puntatore alla SOCKADDR struttura che riceve il nome del socket peer.

lpSockAddrLen
Puntatore alla lunghezza dell'indirizzo in lpSockAddr byte. In caso di restituzione, l'argomento lpSockAddrLen contiene le dimensioni effettive di lpSockAddr restituite in byte.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è sufficientemente grande.

  • WSAEINPROGRESS È in corso una chiamata di Windows Sockets bloccante.

  • WSAENOTCONN Il socket non è connesso.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

Per gestire gli indirizzi IPv6, usare CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Chiamare questa funzione membro per ottenere l'indirizzo del socket peer a cui è connesso questo socket (gestisce gli indirizzi IPv6).

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

Parametri

rPeerAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rPeerPort
Riferimento a un UINT oggetto che archivia una porta.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è sufficientemente grande.

  • WSAEINPROGRESS È in corso una chiamata di Windows Sockets bloccante.

  • WSAENOTCONN Il socket non è connesso.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

Questa funzione è la stessa CAsyncSocket::GetPeerName , ad eccezione del fatto che gestisce gli indirizzi IPv6 e i protocolli meno recenti.

CAsyncSocket::GetSockName

Chiamare questa funzione membro per ottenere il nome locale per un socket.

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

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

Parametri

rSocketAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rSocketPort
Riferimento a un UINT oggetto che archivia una porta.

lpSockAddr
Puntatore a una SOCKADDR struttura che riceve l'indirizzo del socket.

lpSockAddrLen
Puntatore alla lunghezza dell'indirizzo in lpSockAddr byte.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è sufficientemente grande.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEINVAL Il socket non è stato associato a un indirizzo con Bind.

Osservazioni:

Questa chiamata è particolarmente utile quando una Connect chiamata è stata effettuata senza eseguire una Bind prima operazione. Questa chiamata fornisce l'unico mezzo tramite il quale è possibile determinare l'associazione locale impostata dal sistema.

Per gestire gli indirizzi IPv6, usare CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Chiamare questa funzione membro per ottenere il nome locale per un socket (gestisce gli indirizzi IPv6).

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

Parametri

rSocketAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rSocketPort
Riferimento a un UINT oggetto che archivia una porta.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è sufficientemente grande.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEINVAL Il socket non è stato associato a un indirizzo con Bind.

Osservazioni:

Questa chiamata è la stessa CAsyncSocket::GetSockName , ad eccezione del fatto che gestisce gli indirizzi IPv6 e i protocolli meno recenti.

Questa chiamata è particolarmente utile quando una Connect chiamata è stata effettuata senza eseguire una Bind prima operazione. Questa chiamata fornisce l'unico mezzo tramite il quale è possibile determinare l'associazione locale impostata dal sistema.

CAsyncSocket::GetSockOpt

Chiamare questa funzione membro per recuperare un'opzione socket.

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

Parametri

nOptionName
Opzione socket per cui recuperare il valore.

lpOptionValue
Puntatore al buffer in cui deve essere restituito il valore dell'opzione richiesta. Il valore associato all'opzione selezionata viene restituito nel buffer lpOptionValue. L'intero a cui lpOptionLen punta deve contenere originariamente le dimensioni del buffer in byte e, in caso di restituzione, verrà impostato sulle dimensioni del valore restituito. Per , questa sarà la dimensione di una LINGER struttura. Per SO_LINGERtutte le altre opzioni sarà la dimensione di un valore BOOL o , inta seconda dell'opzione. Vedere l'elenco delle opzioni e le relative dimensioni nella sezione Osservazioni.

lpOptionLen
Puntatore alla dimensione del lpOptionValue buffer in byte.

nLevel
Livello in cui viene definita l'opzione; gli unici livelli supportati sono SOL_SOCKET e IPPROTO_TCP.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Se un'opzione non è mai stata impostata con SetSockOpt, GetSockOpt restituisce il valore predefinito per l'opzione . Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpOptionLen non è valido.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOPROTOOPT L'opzione è sconosciuta o non supportata. In particolare, SO_BROADCAST non è supportato nei socket di tipo SOCK_STREAM, mentre SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER, e SO_OOBINLINE non sono supportati nei socket di tipo SOCK_DGRAM.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

GetSockOpt recupera il valore corrente per un'opzione socket associata a un socket di qualsiasi tipo, in qualsiasi stato e archivia il risultato in lpOptionValue. Le opzioni influiscono sulle operazioni socket, ad esempio il routing dei pacchetti, il trasferimento dei dati fuori banda e così via.

Le opzioni seguenti sono supportate per GetSockOpt. Il tipo identifica il tipo di dati indirizzato da lpOptionValue. L'opzione TCP_NODELAY usa il livello IPPROTO_TCP. Tutte le altre opzioni usano il livello SOL_SOCKET.

Valore Digita Significato
SO_ACCEPTCONN BOOL Socket in ascolto.
SO_BROADCAST BOOL Il socket è configurato per la trasmissione di messaggi trasmessi.
SO_DEBUG BOOL Il debug è abilitato.
SO_DONTLINGER BOOL Se true, l'opzione SO_LINGER è disabilitata.
SO_DONTROUTE BOOL Il routing è disabilitato.
SO_ERROR int Recuperare lo stato dell'errore e cancellare.
SO_KEEPALIVE BOOL I keep-alive vengono inviati.
SO_LINGER struct LINGER Restituisce le opzioni correnti del ritardo.
SO_OOBINLINE BOOL I dati fuori banda sono stati ricevuti nel normale flusso di dati.
SO_RCVBUF int Dimensioni del buffer per le ricevute.
SO_REUSEADDR BOOL Il socket può essere associato a un indirizzo già in uso.
SO_SNDBUF int Dimensioni del buffer per gli invii.
SO_TYPE int Tipo del socket , ad esempio SOCK_STREAM.
TCP_NODELAY BOOL Disabilita l'algoritmo Nagle di unione dei pacchetti in invio.

Le opzioni di Berkeley Software Distribution (BSD) non supportate per GetSockOpt sono:

Valore Digita Significato
SO_RCVLOWAT int Ricevere un segno d'acqua basso.
SO_RCVTIMEO int Timeout di ricezione.
SO_SNDLOWAT int Invia segno d'acqua basso.
SO_SNDTIMEO int Timeout di invio.
IP_OPTIONS Ottenere le opzioni nell'intestazione IP.
TCP_MAXSEG int Ottiene le dimensioni massime del segmento TCP.

La chiamata GetSockOpt con un'opzione non supportata comporterà la restituzione di un codice di WSAENOPROTOOPT errore da GetLastError.

CAsyncSocket::IOCtl

Chiamare questa funzione membro per controllare la modalità di un socket.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Parametri

lCommand
Comando da eseguire sul socket.

lpArgument
Puntatore a un parametro per lCommand.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEINVALlCommand non è un comando valido o lpArgument non è un parametro accettabile per lCommando il comando non è applicabile al tipo di socket fornito.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

Questa routine può essere utilizzata su qualsiasi socket in qualsiasi stato. Viene usato per ottenere o recuperare i parametri operativi associati al socket, indipendentemente dal protocollo e dal sottosistema di comunicazione. Supporta i comandi seguenti:

  • FIONBIO Abilitare o disabilitare la modalità di non blocco sul socket. Il lpArgument parametro punta a un DWORDoggetto , diverso da zero se la modalità non di blocco deve essere abilitata e zero se deve essere disabilitata. Se AsyncSelect è stato emesso su un socket, qualsiasi tentativo di usare IOCtl per impostare di nuovo il socket sulla modalità di blocco avrà esito negativo con WSAEINVAL. Per ripristinare la modalità di blocco del socket e impedire l'erroreWSAEINVAL, un'applicazione deve prima disabilitare AsyncSelect chiamando con il lEvent parametro uguale a 0, quindi chiamare AsyncSelectIOCtl.

  • FIONREAD Determinare il numero massimo di byte che possono essere letti con una Receive chiamata da questo socket. Il lpArgument parametro punta a un DWORD oggetto in cui IOCtl archivia il risultato. Se questo socket è di tipo SOCK_STREAM, FIONREAD restituisce la quantità totale di dati che possono essere letti in un singolo Receiveoggetto . In genere corrisponde alla quantità totale di dati accodati sul socket. Se questo socket è di tipo SOCK_DGRAM, FIONREAD restituisce le dimensioni del primo datagramma accodato sul socket.

  • SIOCATMARK Determinare se tutti i dati fuori banda sono stati letti. Questo vale solo per un socket di tipo SOCK_STREAM configurato per la ricezione in linea di tutti i dati fuori banda ( SO_OOBINLINE). Se non sono presenti dati fuori banda in attesa di essere letti, l'operazione restituisce un valore diverso da zero. In caso contrario, restituisce 0 e il successivo Receive o ReceiveFrom eseguito sul socket recupererà alcuni o tutti i dati precedenti al "contrassegno". L'applicazione deve usare l'operazione SIOCATMARK per determinare se i dati rimangono. Se sono presenti dati normali che precedono i dati "urgenti" (fuori banda), verranno ricevuti in ordine. Si noti che un Receive oggetto o ReceiveFrom non mixerà mai dati fuori banda e normali nella stessa chiamata. Il lpArgument parametro punta a un DWORD oggetto in cui IOCtl archivia il risultato.

Questa funzione è un subset di ioctl() come usato nei socket Berkeley. In particolare, non esiste alcun comando equivalente a FIOASYNC, mentre SIOCATMARK è l'unico comando a livello di socket supportato.

CAsyncSocket::Listen

Chiamare questa funzione membro per restare in ascolto delle richieste di connessione in ingresso.

BOOL Listen(int nConnectionBacklog = 5);

Parametri

nConnectionBacklog
Lunghezza massima alla quale può aumentare la coda di connessioni in sospeso. L'intervallo valido è compreso tra 1 e 5.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEADDRINUSE È stato effettuato un tentativo di ascolto su un indirizzo in uso.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEINVAL Il socket non è stato associato o Bind è già connesso.

  • WSAEISCONN Il socket è già connesso.

  • WSAEMFILE Non sono disponibili altri descrittori di file.

  • WSAENOBUFS Non è disponibile alcuno spazio nel buffer.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPP Il socket a cui si fa riferimento non è di un tipo che supporta l'operazione Listen .

Osservazioni:

Per accettare le connessioni, il socket viene prima creato con Create, viene specificato un backlog per le connessioni in ingresso con Listene quindi le connessioni vengono accettate con Accept. Listen si applica solo ai socket che supportano le connessioni, ovvero quelle di tipo SOCK_STREAM. Questo socket viene messo in modalità "passiva" in cui le connessioni in ingresso vengono riconosciute e accodate in attesa di accettazione da parte del processo.

Questa funzione viene in genere usata dai server (o da qualsiasi applicazione che vuole accettare connessioni) che potrebbero avere più di una richiesta di connessione alla volta: se una richiesta di connessione arriva con la coda completa, il client riceverà un errore con un'indicazione di WSAECONNREFUSED.

Listen tenta di continuare a funzionare razionalmente quando non sono disponibili porte (descrittori). Accetterà connessioni fino a quando la coda non viene svuotata. Se le porte diventano disponibili, una chiamata successiva a Listen o Accept riempie la coda al "backlog" corrente o più recente, se possibile, e riprende l'ascolto delle connessioni in ingresso.

CAsyncSocket::m_hSocket

Contiene l'handle SOCKET per il socket incapsulato da questo CAsyncSocket oggetto.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Chiamato dal framework per notificare a un socket di ascolto che può accettare richieste di connessione in sospeso chiamando la Accept funzione membro.

virtual void OnAccept(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnAccept funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

Osservazioni:

Per altre informazioni, vedere Windows Sockets: Socket Notifications.For more information, see Windows Sockets: Socket Notifications.

CAsyncSocket::OnClose

Chiamato dal framework per notificare a questo socket che il socket connesso è chiuso dal processo.

virtual void OnClose(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnClose funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAECONNRESET La connessione è stata reimpostata dal lato remoto.

  • WSAECONNABORTED La connessione è stata interrotta a causa di un timeout o di un altro errore.

Osservazioni:

Per altre informazioni, vedere Windows Sockets: Socket Notifications.For more information, see Windows Sockets: Socket Notifications.

CAsyncSocket::OnConnect

Chiamato dal framework per notificare a questo socket di connessione che il tentativo di connessione è stato completato, se correttamente o in errore.

virtual void OnConnect(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnConnect funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAEADDRINUSE L'indirizzo specificato è già in uso.

  • WSAEADDRNOTAVAIL L'indirizzo specificato non è disponibile nel computer locale.

  • WSAEAFNOSUPPORT Gli indirizzi nella famiglia specificata non possono essere utilizzati con questo socket.

  • WSAECONNREFUSED Il tentativo di connessione è stato rifiutato forzatamente.

  • WSAEDESTADDRREQ È necessario un indirizzo di destinazione.

  • WSAEFAULT L'argomento lpSockAddrLen non è corretto.

  • WSAEINVAL Il socket è già associato a un indirizzo.

  • WSAEISCONN Il socket è già connesso.

  • WSAEMFILE Non sono disponibili altri descrittori di file.

  • WSAENETUNREACH Impossibile raggiungere la rete da questo host al momento.

  • WSAENOBUFS Non è disponibile alcuno spazio nel buffer. Il socket non può essere collegato.

  • WSAENOTCONN Il socket non è connesso.

  • WSAENOTSOCK Il descrittore è un file, non un socket.

  • WSAETIMEDOUT Tentativo di connessione timeout senza stabilire una connessione.

Osservazioni:

Nota

In CSocketla OnConnect funzione di notifica non viene mai chiamata. Per le connessioni, è sufficiente chiamare Connect, che restituirà quando la connessione viene completata (correttamente o in errore). La modalità di gestione delle notifiche di connessione è un dettaglio di implementazione MFC.

Per altre informazioni, vedere Windows Sockets: Socket Notifications.For more information, see Windows Sockets: Socket Notifications.

Esempio

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

Chiamato dal framework per notificare al socket ricevente che il socket di invio dispone di dati fuori banda da inviare.

virtual void OnOutOfBandData(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnOutOfBandData funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

Osservazioni:

I dati fuori banda sono un canale logicamente indipendente associato a ogni coppia di socket connessi di tipo SOCK_STREAM. Il canale viene in genere usato per inviare dati urgenti.

MFC supporta i dati fuori banda, ma gli utenti della classe CAsyncSocket non possono usarli. Il modo più semplice consiste nel creare un secondo socket per il passaggio di tali dati. Per altre informazioni sui dati fuori banda, vedere Windows Sockets: Socket Notifications.For more information about out-of-band data, see Windows Sockets: Socket Notifications.

CAsyncSocket::OnReceive

Chiamato dal framework per notificare a questo socket che sono presenti dati nel buffer che possono essere recuperati chiamando la Receive funzione membro.

virtual void OnReceive(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnReceive funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

Osservazioni:

Per altre informazioni, vedere Windows Sockets: Socket Notifications.For more information, see Windows Sockets: Socket Notifications.

Esempio

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

Chiamato dal framework per notificare al socket che ora può inviare dati chiamando la Send funzione membro.

virtual void OnSend(int nErrorCode);

Parametri

nErrorCode
Errore più recente in un socket. I codici di errore seguenti si applicano alla OnSend funzione membro:

  • 0 La funzione è stata eseguita correttamente.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

Osservazioni:

Per altre informazioni, vedere Windows Sockets: Socket Notifications.For more information, see Windows Sockets: Socket Notifications.

Esempio

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

Assegna un nuovo valore a un CAsyncSocket oggetto .

void operator=(const CAsyncSocket& rSrc);

Parametri

rSrc
Riferimento a un oggetto esistente CAsyncSocket .

Osservazioni:

Chiamare questa funzione per copiare un oggetto esistente CAsyncSocket in un altro CAsyncSocket oggetto.

CAsyncSocket::operator SOCKET

Utilizzare questo operatore per recuperare l'handle SOCKET dell'oggetto CAsyncSocket .

operator SOCKET() const;

Valore restituito

Se ha esito positivo, l'handle dell'oggetto SOCKET ; in caso contrario, NULL.

Osservazioni:

È possibile usare l'handle per chiamare direttamente le API di Windows.

CAsyncSocket::Receive

Chiamare questa funzione membro per ricevere dati da un socket.

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

Parametri

lpBuf
Buffer per i dati in ingresso.

nBufLen
Lunghezza di lpBuf in byte.

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_PEEK Visualizzare i dati in ingresso. I dati vengono copiati nel buffer, ma non vengono rimossi dalla coda di input.

  • MSG_OOB Elaborare i dati fuori banda.

Valore restituito

Se non si verifica alcun errore, Receive restituisce il numero di byte ricevuti. Se la connessione è stata chiusa, restituisce 0. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAENOTCONN Il socket non è connesso.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare Receive su un socket dopo ShutDown che è stato richiamato con nHow impostato su 0 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione Receive si blocca.

  • WSAEMSGSIZE Il datagramma era troppo grande per adattarsi al buffer specificato ed è stato troncato.

  • WSAEINVAL Il socket non è stato associato a Bind.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

Osservazioni:

Questa funzione viene usata per i socket di flusso o di datagrammi connessi e viene usata per leggere i dati in ingresso.

Per i socket di tipo SOCK_STREAM, viene restituita la quantità di informazioni attualmente disponibile fino alle dimensioni del buffer fornito. Se il socket è stato configurato per la ricezione in linea dei dati fuori banda (opzione SO_OOBINLINEsocket ) e i dati fuori banda non sono letti, verranno restituiti solo i dati fuori banda. L'applicazione può usare l'opzione IOCtlSIOCATMARK o OnOutOfBandData per determinare se devono essere letti altri dati fuori banda.

Per i socket di datagrammi, i dati vengono estratti dal primo datagramma accodato, fino alle dimensioni del buffer fornito. Se il datagram è maggiore del buffer fornito, il buffer viene riempito con la prima parte del datagramma, i dati in eccesso vengono persi e Receive restituisce un valore con il codice di SOCKET_ERROR errore impostato su WSAEMSGSIZE. Se nel socket non sono disponibili dati in ingresso, viene restituito un valore di SOCKET_ERROR con il codice di errore impostato su WSAEWOULDBLOCK. La OnReceive funzione di callback può essere usata per determinare quando arrivano più dati.

Se il socket è di tipo SOCK_STREAM e il lato remoto ha arrestato correttamente la connessione, un Receive verrà completato immediatamente con 0 byte ricevuti. Se la connessione è stata reimpostata, un errore Receive avrà esito negativo con l'errore WSAECONNRESET.

Receive deve essere chiamato una sola volta per ogni chiamata CAsyncSocket::OnReceive .

Esempio

Vedere l'esempio per CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Chiamare questa funzione membro per ricevere un datagramma e archiviare l'indirizzo di origine nella SOCKADDR struttura o in 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);

Parametri

lpBuf
Buffer per i dati in ingresso.

nBufLen
Lunghezza di lpBuf in byte.

rSocketAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rSocketPort
Riferimento a un UINT oggetto che archivia una porta.

lpSockAddr
Puntatore a una SOCKADDR struttura che contiene l'indirizzo di origine al momento della restituzione.

lpSockAddrLen
Puntatore alla lunghezza dell'indirizzo di origine in lpSockAddr byte.

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_PEEK Visualizzare i dati in ingresso. I dati vengono copiati nel buffer, ma non vengono rimossi dalla coda di input.

  • MSG_OOB Elaborare i dati fuori banda.

Valore restituito

Se non si verifica alcun errore, ReceiveFrom restituisce il numero di byte ricevuti. Se la connessione è stata chiusa, restituisce 0. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è valido: il lpSockAddr buffer era troppo piccolo per contenere l'indirizzo peer.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEINVAL Il socket non è stato associato a Bind.

  • WSAENOTCONN Il socket non è connesso (SOCK_STREAM solo).

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare ReceiveFrom su un socket dopo ShutDown che è stato richiamato con nHow impostato su 0 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione ReceiveFrom si blocca.

  • WSAEMSGSIZE Il datagramma era troppo grande per adattarsi al buffer specificato ed è stato troncato.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

Osservazioni:

Questa funzione viene usata per leggere i dati in ingresso in un socket (possibilmente connesso) e acquisire l'indirizzo da cui sono stati inviati i dati.

Per gestire gli indirizzi IPv6, usare CAsyncSocket::ReceiveFromEx.

Per i socket di tipo SOCK_STREAM, viene restituita la quantità di informazioni attualmente disponibile fino alle dimensioni del buffer fornito. Se il socket è stato configurato per la ricezione in linea dei dati fuori banda (opzione SO_OOBINLINEsocket ) e i dati fuori banda non sono letti, verranno restituiti solo i dati fuori banda. L'applicazione può usare l'opzione IOCtlSIOCATMARK o OnOutOfBandData per determinare se devono essere letti altri dati fuori banda. I lpSockAddr parametri e lpSockAddrLen vengono ignorati per SOCK_STREAM i socket.

Per i socket di datagrammi, i dati vengono estratti dal primo datagramma accodato, fino alle dimensioni del buffer fornito. Se il datagram è maggiore del buffer fornito, il buffer viene riempito con la prima parte del messaggio, i dati in eccesso vengono persi e ReceiveFrom restituisce un valore con il codice di SOCKET_ERROR errore impostato su WSAEMSGSIZE.

Se lpSockAddr è diverso da zero e il socket è di tipo SOCK_DGRAM, l'indirizzo di rete del socket che ha inviato i dati viene copiato nella struttura corrispondente SOCKADDR . Il valore a cui lpSockAddrLen punta viene inizializzato alla dimensione di questa struttura e viene modificato in modo da indicare le dimensioni effettive dell'indirizzo archiviato. Se non sono disponibili dati in ingresso nel socket, la ReceiveFrom chiamata attende l'arrivo dei dati, a meno che il socket non si blocchi. In questo caso, viene restituito un valore di con il codice di SOCKET_ERROR errore impostato su WSAEWOULDBLOCK. Il OnReceive callback può essere usato per determinare quando arrivano più dati.

Se il socket è di tipo SOCK_STREAM e il lato remoto ha arrestato correttamente la connessione, un ReceiveFrom verrà completato immediatamente con 0 byte ricevuti.

CAsyncSocket::ReceiveFromEx

Chiamare questa funzione membro per ricevere un datagramma e archiviare l'indirizzo di origine nella SOCKADDR struttura o in rSocketAddress (gestisce gli indirizzi IPv6).

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

Parametri

lpBuf
Buffer per i dati in ingresso.

nBufLen
Lunghezza di lpBuf in byte.

rSocketAddress
Riferimento a un CString oggetto che riceve un indirizzo IP con numeri punteggiati.

rSocketPort
Riferimento a un UINT oggetto che archivia una porta.

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_PEEK Visualizzare i dati in ingresso. I dati vengono copiati nel buffer, ma non vengono rimossi dalla coda di input.

  • MSG_OOB Elaborare i dati fuori banda.

Valore restituito

Se non si verifica alcun errore, ReceiveFromEx restituisce il numero di byte ricevuti. Se la connessione è stata chiusa, restituisce 0. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULT L'argomento lpSockAddrLen non è valido: il lpSockAddr buffer era troppo piccolo per contenere l'indirizzo peer.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEINVAL Il socket non è stato associato a Bind.

  • WSAENOTCONN Il socket non è connesso (SOCK_STREAM solo).

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare ReceiveFromEx su un socket dopo ShutDown che è stato richiamato con nHow impostato su 0 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione ReceiveFromEx si blocca.

  • WSAEMSGSIZE Il datagramma era troppo grande per adattarsi al buffer specificato ed è stato troncato.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

Osservazioni:

Questa funzione viene usata per leggere i dati in ingresso in un socket (possibilmente connesso) e acquisire l'indirizzo da cui sono stati inviati i dati.

Questa funzione è la stessa CAsyncSocket::ReceiveFrom , ad eccezione del fatto che gestisce gli indirizzi IPv6 e i protocolli meno recenti.

Per i socket di tipo SOCK_STREAM, viene restituita la quantità di informazioni attualmente disponibile fino alle dimensioni del buffer fornito. Se il socket è stato configurato per la ricezione in linea dei dati fuori banda (opzione SO_OOBINLINEsocket ) e i dati fuori banda non sono letti, verranno restituiti solo i dati fuori banda. L'applicazione può usare l'opzione IOCtlSIOCATMARK o OnOutOfBandData per determinare se devono essere letti altri dati fuori banda. I lpSockAddr parametri e lpSockAddrLen vengono ignorati per SOCK_STREAM i socket.

Per i socket di datagrammi, i dati vengono estratti dal primo datagramma accodato, fino alle dimensioni del buffer fornito. Se il datagram è maggiore del buffer fornito, il buffer viene riempito con la prima parte del messaggio, i dati in eccesso vengono persi e ReceiveFromEx restituisce un valore con il codice di SOCKET_ERROR errore impostato su WSAEMSGSIZE.

Se lpSockAddr è diverso da zero e il socket è di tipo SOCK_DGRAM, l'indirizzo di rete del socket che ha inviato i dati viene copiato nella struttura corrispondente SOCKADDR . Il valore a cui lpSockAddrLen punta viene inizializzato alla dimensione di questa struttura e viene modificato in modo da indicare le dimensioni effettive dell'indirizzo archiviato. Se non sono disponibili dati in ingresso nel socket, la ReceiveFromEx chiamata attende l'arrivo dei dati, a meno che il socket non si blocchi. In questo caso, viene restituito un valore di con il codice di SOCKET_ERROR errore impostato su WSAEWOULDBLOCK. Il OnReceive callback può essere usato per determinare quando arrivano più dati.

Se il socket è di tipo SOCK_STREAM e il lato remoto ha arrestato correttamente la connessione, un ReceiveFromEx verrà completato immediatamente con 0 byte ricevuti.

CAsyncSocket::Send

Chiamare questa funzione membro per inviare dati su un socket connesso.

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

Parametri

lpBuf
Buffer contenente i dati da trasmettere.

nBufLen
Lunghezza dei dati in lpBuf byte.

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_DONTROUTE Specifica che i dati non devono essere soggetti al routing. Un fornitore di Windows Sockets può scegliere di ignorare questo flag.

  • MSG_OOB Inviare dati fuori banda (SOCK_STREAM solo).

Valore restituito

Se non si verifica alcun errore, Send restituisce il numero totale di caratteri inviati. Si noti che questo valore può essere minore del numero indicato da nBufLen. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEACCES L'indirizzo richiesto è un indirizzo di trasmissione, ma il flag appropriato non è stato impostato.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEFAULT L'argomento lpBuf non si trova in una parte valida dello spazio indirizzi utente.

  • WSAENETRESET La connessione deve essere reimpostata perché l'implementazione di Windows Sockets l'ha eliminata.

  • WSAENOBUFS L'implementazione di Windows Sockets segnala un deadlock del buffer.

  • WSAENOTCONN Il socket non è connesso.

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare Send su un socket dopo ShutDown che è stato richiamato con nHow impostato su 1 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.

  • WSAEMSGSIZE Il socket è di tipo SOCK_DGRAMe il datagramma è maggiore del massimo supportato dall'implementazione di Windows Sockets.

  • WSAEINVAL Il socket non è stato associato a Bind.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

Osservazioni:

Send viene usato per scrivere dati in uscita in socket di flusso o datagrammi connessi. Per i socket di datagrammi, è necessario prestare attenzione a non superare le dimensioni massime del pacchetto IP delle subnet sottostanti, dato dall'elemento iMaxUdpDg nella WSADATA struttura restituita da AfxSocketInit. Se i dati sono troppo lunghi per passare in modo atomico tramite il protocollo sottostante, l'errore WSAEMSGSIZE viene restituito tramite GetLastErrore non vengono trasmessi dati.

Si noti che per un socket del datagramma il completamento corretto di un oggetto Send non indica che i dati sono stati recapitati correttamente.

Negli CAsyncSocket oggetti di tipo SOCK_STREAM, il numero di byte scritti può essere compreso tra 1 e la lunghezza richiesta, a seconda della disponibilità del buffer sia negli host locali che in quello esterno.

Esempio

Vedere l'esempio per CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Chiamare questa funzione membro per inviare dati a una destinazione specifica.

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);

Parametri

lpBuf
Buffer contenente i dati da trasmettere.

nBufLen
Lunghezza dei dati in lpBuf byte.

nHostPort
Porta che identifica l'applicazione socket.

lpszHostAddress
Indirizzo di rete del socket a cui è connesso l'oggetto: un nome del computer, ad esempio "ftp.microsoft.com" o un numero punteggiato, ad esempio "128.56.22.8".

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_DONTROUTE Specifica che i dati non devono essere soggetti al routing. Un fornitore di Windows Sockets può scegliere di ignorare questo flag.

  • MSG_OOB Inviare dati fuori banda (SOCK_STREAM solo).

lpSockAddr
Puntatore a una SOCKADDR struttura che contiene l'indirizzo del socket di destinazione.

nSockAddrLen
Lunghezza dell'indirizzo in lpSockAddr byte.

Valore restituito

Se non si verifica alcun errore, SendTo restituisce il numero totale di caratteri inviati. Si noti che questo valore può essere minore del numero indicato da nBufLen. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEACCES L'indirizzo richiesto è un indirizzo di trasmissione, ma il flag appropriato non è stato impostato.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEFAULT I lpBuf parametri o lpSockAddr non fanno parte dello spazio degli indirizzi utente o l'argomento lpSockAddr è troppo piccolo (minore delle dimensioni di una SOCKADDR struttura).

  • WSAEINVAL Il nome host non è valido.

  • WSAENETRESET La connessione deve essere reimpostata perché l'implementazione di Windows Sockets l'ha eliminata.

  • WSAENOBUFS L'implementazione di Windows Sockets segnala un deadlock del buffer.

  • WSAENOTCONN Il socket non è connesso (SOCK_STREAM solo).

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare SendTo su un socket dopo ShutDown che è stato richiamato con nHow impostato su 1 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.

  • WSAEMSGSIZE Il socket è di tipo SOCK_DGRAMe il datagramma è maggiore del massimo supportato dall'implementazione di Windows Sockets.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

  • WSAEADDRNOTAVAIL L'indirizzo specificato non è disponibile nel computer locale.

  • WSAEAFNOSUPPORT Gli indirizzi nella famiglia specificata non possono essere utilizzati con questo socket.

  • WSAEDESTADDRREQ È necessario un indirizzo di destinazione.

  • WSAENETUNREACH Impossibile raggiungere la rete da questo host al momento.

Osservazioni:

SendTo viene usato in datagrammi o socket di flusso e viene usato per scrivere dati in uscita in un socket. Per i socket di datagrammi, è necessario prestare attenzione a non superare le dimensioni massime del pacchetto IP delle subnet sottostanti, dato dall'elemento iMaxUdpDg nella WSADATA struttura compilata da AfxSocketInit. Se i dati sono troppo lunghi per passare atomicamente attraverso il protocollo sottostante, viene restituito l'errore WSAEMSGSIZE e non vengono trasmessi dati.

Si noti che il completamento corretto di un oggetto SendTo non indica che i dati sono stati recapitati correttamente.

SendTo viene usato solo in un SOCK_DGRAM socket per inviare un datagramma a un socket specifico identificato dal lpSockAddr parametro .

Per inviare una trasmissione (solo su ), SOCK_DGRAM l'indirizzo nel lpSockAddr parametro deve essere costruito usando l'indirizzo INADDR_BROADCAST IP speciale (definito nel file WINSOCK.Hdi intestazione Windows Sockets ) insieme al numero di porta desiderato. In alternativa, se il lpszHostAddress parametro è NULL, il socket è configurato per la trasmissione. In genere è sconsigliabile che un datagramma di trasmissione superi le dimensioni in cui può verificarsi la frammentazione, il che implica che la parte dei dati dell'datagramma (escluse le intestazioni) non deve superare i 512 byte.

Per gestire gli indirizzi IPv6, usare CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Chiamare questa funzione membro per inviare dati a una destinazione specifica (gestisce gli indirizzi IPv6).

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

Parametri

lpBuf
Buffer contenente i dati da trasmettere.

nBufLen
Lunghezza dei dati in lpBuf byte.

nHostPort
Porta che identifica l'applicazione socket.

lpszHostAddress
Indirizzo di rete del socket a cui è connesso l'oggetto: un nome del computer, ad esempio "ftp.microsoft.com" o un numero punteggiato, ad esempio "128.56.22.8".

nFlags
Specifica il modo in cui viene effettuata la chiamata. La semantica di questa funzione è determinata dalle opzioni socket e dal nFlags parametro . Quest'ultimo viene costruito combinando uno dei valori seguenti con l'operatore OR bit per bit C++ (|):

  • MSG_DONTROUTE Specifica che i dati non devono essere soggetti al routing. Un fornitore di Windows Sockets può scegliere di ignorare questo flag.

  • MSG_OOB Inviare dati fuori banda (SOCK_STREAM solo).

Valore restituito

Se non si verifica alcun errore, SendToEx restituisce il numero totale di caratteri inviati. Si noti che questo valore può essere minore del numero indicato da nBufLen. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEACCES L'indirizzo richiesto è un indirizzo di trasmissione, ma il flag appropriato non è stato impostato.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEFAULT I lpBuf parametri o lpSockAddr non fanno parte dello spazio degli indirizzi utente o l'argomento lpSockAddr è troppo piccolo (minore delle dimensioni di una SOCKADDR struttura).

  • WSAEINVAL Il nome host non è valido.

  • WSAENETRESET La connessione deve essere reimpostata perché l'implementazione di Windows Sockets l'ha eliminata.

  • WSAENOBUFS L'implementazione di Windows Sockets segnala un deadlock del buffer.

  • WSAENOTCONN Il socket non è connesso (SOCK_STREAM solo).

  • WSAENOTSOCK Il descrittore non è un socket.

  • WSAEOPNOTSUPPMSG_OOB è stato specificato, ma il socket non è di tipo SOCK_STREAM.

  • WSAESHUTDOWN Il socket è stato arrestato; non è possibile chiamare SendToEx su un socket dopo ShutDown che è stato richiamato con nHow impostato su 1 o 2.

  • WSAEWOULDBLOCK Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.

  • WSAEMSGSIZE Il socket è di tipo SOCK_DGRAMe il datagramma è maggiore del massimo supportato dall'implementazione di Windows Sockets.

  • WSAECONNABORTED Il circuito virtuale è stato interrotto a causa di un timeout o di un altro errore.

  • WSAECONNRESET Il circuito virtuale è stato reimpostato dal lato remoto.

  • WSAEADDRNOTAVAIL L'indirizzo specificato non è disponibile nel computer locale.

  • WSAEAFNOSUPPORT Gli indirizzi nella famiglia specificata non possono essere utilizzati con questo socket.

  • WSAEDESTADDRREQ È necessario un indirizzo di destinazione.

  • WSAENETUNREACH Impossibile raggiungere la rete da questo host al momento.

Osservazioni:

Questo metodo è lo stesso CAsyncSocket::SendTo , ad eccezione del fatto che gestisce gli indirizzi IPv6 e i protocolli meno recenti.

SendToEx viene usato in datagrammi o socket di flusso e viene usato per scrivere dati in uscita in un socket. Per i socket di datagrammi, è necessario prestare attenzione a non superare le dimensioni massime del pacchetto IP delle subnet sottostanti, dato dall'elemento iMaxUdpDg nella WSADATA struttura compilata da AfxSocketInit. Se i dati sono troppo lunghi per passare atomicamente attraverso il protocollo sottostante, viene restituito l'errore WSAEMSGSIZE e non vengono trasmessi dati.

Si noti che il completamento corretto di un oggetto SendToEx non indica che i dati sono stati recapitati correttamente.

SendToEx viene usato solo in un SOCK_DGRAM socket per inviare un datagramma a un socket specifico identificato dal lpSockAddr parametro .

Per inviare una trasmissione (solo su ), SOCK_DGRAM l'indirizzo nel lpSockAddr parametro deve essere costruito usando l'indirizzo INADDR_BROADCAST IP speciale (definito nel file WINSOCK.Hdi intestazione Windows Sockets ) insieme al numero di porta desiderato. In alternativa, se il lpszHostAddress parametro è NULL, il socket è configurato per la trasmissione. In genere è sconsigliabile che un datagramma di trasmissione superi le dimensioni in cui può verificarsi la frammentazione, il che implica che la parte dei dati dell'datagramma (escluse le intestazioni) non deve superare i 512 byte.

CAsyncSocket::SetSockOpt

Chiamare questa funzione membro per impostare un'opzione socket.

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

Parametri

nOptionName
Opzione socket per cui impostare il valore.

lpOptionValue
Puntatore al buffer in cui viene fornito il valore per l'opzione richiesta.

nOptionLen
Dimensione del lpOptionValue buffer in byte.

nLevel
Livello in cui viene definita l'opzione; gli unici livelli supportati sono SOL_SOCKET e IPPROTO_TCP.

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEFAULTlpOptionValue non è incluso in una parte valida dello spazio indirizzi del processo.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAEINVALnLevel non è valido oppure le informazioni contenute in lpOptionValue non sono valide.

  • WSAENETRESETConnessione ion è scaduto quando SO_KEEPALIVE è impostato.

  • WSAENOPROTOOPT L'opzione è sconosciuta o non supportata. In particolare, SO_BROADCAST non è supportato nei socket di tipo SOCK_STREAM, mentre SO_DONTLINGER, SO_KEEPALIVESO_LINGER, e SO_OOBINLINE non sono supportati nei socket di tipo SOCK_DGRAM.

  • WSAENOTCONNConnessione ion è stato reimpostato quando SO_KEEPALIVE è impostato.

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

SetSockOpt imposta il valore corrente per un'opzione socket associata a un socket di qualsiasi tipo, in qualsiasi stato. Anche se le opzioni possono esistere a più livelli di protocollo, questa specifica definisce solo le opzioni esistenti a livello di "socket" superiore. Le opzioni influiscono sulle operazioni socket, ad esempio se i dati accelerati vengono ricevuti nel normale flusso di dati, se i messaggi trasmessi possono essere inviati sul socket e così via.

Esistono due tipi di opzioni socket: opzioni booleane che abilitano o disabilitano una funzionalità o un comportamento e opzioni che richiedono un valore intero o una struttura. Per abilitare un'opzione booleana, lpOptionValue punta a un intero diverso da zero. Per disabilitare l'opzione lpOptionValue punta a un numero intero uguale a zero. nOptionLen deve essere uguale a sizeof(BOOL) per le opzioni booleane. Per altre opzioni, lpOptionValue punta all'intero o alla struttura che contiene il valore desiderato per l'opzione ed nOptionLen è la lunghezza dell'intero o della struttura.

SO_LINGER controlla l'azione eseguita quando i dati non inviati vengono accodati su un socket e la Close funzione viene chiamata per chiudere il socket.

Per impostazione predefinita, un socket non può essere associato (vedere Bind) a un indirizzo locale già in uso. In alcuni casi, tuttavia, potrebbe essere opportuno "riutilizzare" un indirizzo in questo modo. Poiché ogni connessione viene identificata in modo univoco dalla combinazione di indirizzi locali e remoti, non esiste alcun problema con due socket associati allo stesso indirizzo locale, purché gli indirizzi remoti siano diversi.

Per informare l'implementazione di Windows Sockets che una Bind chiamata su un socket non deve essere consentita perché l'indirizzo desiderato è già in uso da un altro socket, l'applicazione deve impostare l'opzione SO_REUSEADDR socket per il socket prima di eseguire la Bind chiamata. Si noti che l'opzione viene interpretata solo al momento della Bind chiamata: è quindi superfluo (ma innocuo) impostare l'opzione su un socket che non deve essere associato a un indirizzo esistente e impostare o reimpostare l'opzione dopo che la Bind chiamata non ha alcun effetto su questo o su qualsiasi altro socket.

Un'applicazione può richiedere che l'implementazione di Windows Sockets consenta l'uso di pacchetti "keep-alive" sulle connessioni TCP (Transmission Control Protocol) attivando l'opzione SO_KEEPALIVE socket. Un'implementazione di Windows Sockets non deve supportare l'uso di keep-alive: in caso affermativo, la semantica precisa è specifica dell'implementazione, ma deve essere conforme alla sezione 4.2.3.6 di RFC 1122: "Requisiti per gli host Internet - Livelli di comunicazione". Se una connessione viene eliminata come risultato di "keep-alives", il codice WSAENETRESET di errore viene restituito a tutte le chiamate in corso sul socket e tutte le chiamate successive avranno esito negativo con WSAENOTCONN.

L'opzione TCP_NODELAY disabilita l'algoritmo Nagle. L'algoritmo Nagle viene usato per ridurre il numero di pacchetti di piccole dimensioni inviati da un host memorizzando nel buffer i dati non riconosciuti fino a quando non è possibile inviare un pacchetto di dimensioni complete. Tuttavia, per alcune applicazioni questo algoritmo può compromettere le prestazioni e TCP_NODELAY può essere usato per disattivarlo. I writer di applicazioni non devono essere impostati TCP_NODELAY a meno che l'impatto di questa operazione non sia ben compreso e desiderato, poiché l'impostazione TCP_NODELAY può avere un impatto negativo significativo sulle prestazioni di rete. TCP_NODELAY è l'unica opzione socket supportata che usa il livello IPPROTO_TCP. Tutte le altre opzioni usano il livello SOL_SOCKET.

Alcune implementazioni di Windows Sockets forniscono informazioni di debug di output se l'opzione SO_DEBUG è impostata da un'applicazione.

Le opzioni seguenti sono supportate per SetSockOpt. Il tipo identifica il tipo di dati indirizzato da lpOptionValue.

Valore Digita Significato
SO_BROADCAST BOOL Consente la trasmissione di messaggi trasmessi sul socket.
SO_DEBUG BOOL Registra informazioni di debug.
SO_DONTLINGER BOOL Non bloccare Close l'attesa dell'invio dei dati non inviati. L'impostazione di questa opzione equivale all'impostazione SO_LINGER con l_onoff impostato su zero.
SO_DONTROUTE BOOL Non instradare: inviare direttamente all'interfaccia.
SO_KEEPALIVE BOOL Invia keep-alive.
SO_LINGER struct LINGER Linger on Close if unsent data is present.
SO_OOBINLINE BOOL Ricevere dati fuori banda nel normale flusso di dati.
SO_RCVBUF int Specificare le dimensioni del buffer per le ricevute.
SO_REUSEADDR BOOL Consentire l'associazione del socket a un indirizzo già in uso. (Vedere Bind.)
SO_SNDBUF int Specificare le dimensioni del buffer per gli invii.
TCP_NODELAY BOOL Disabilita l'algoritmo Nagle di unione dei pacchetti in invio.

Le opzioni di Berkeley Software Distribution (BSD) non supportate per SetSockOpt sono:

Valore Digita Significato
SO_ACCEPTCONN BOOL Socket in ascolto
SO_ERROR int Ottenere lo stato dell'errore e deselezionare.
SO_RCVLOWAT int Ricevere un segno d'acqua basso.
SO_RCVTIMEO int Timeout di ricezione
SO_SNDLOWAT int Invia segno d'acqua basso.
SO_SNDTIMEO int Timeout di invio.
SO_TYPE int Tipo del socket.
IP_OPTIONS Impostare il campo opzioni nell'intestazione IP.

CAsyncSocket::ShutDown

Chiamare questa funzione membro per disabilitare l'invio, la ricezione o entrambi sul socket.

BOOL ShutDown(int nHow = sends);

Parametri

nHow
Flag che descrive quali tipi di operazione non saranno più consentiti, usando i valori enumerati seguenti:

  • receives = 0

  • invia = 1

  • both = 2

Valore restituito

Diverso da zero se la funzione ha esito positivo; in caso contrario, 0 e un codice di errore specifico può essere recuperato chiamando GetLastError. Gli errori seguenti si applicano a questa funzione membro:

  • WSANOTINITIALISED Un esito positivo AfxSocketInit deve verificarsi prima di usare questa API.

  • WSAENETDOWN L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.

  • WSAEINVALnHow non è valido.

  • WSAEINPROGRESS È in corso un'operazione di blocco di Windows Sockets.

  • WSAENOTCONN Il socket non è connesso (SOCK_STREAM solo).

  • WSAENOTSOCK Il descrittore non è un socket.

Osservazioni:

ShutDown viene utilizzato su tutti i tipi di socket per disabilitare la ricezione, la trasmissione o entrambi. Se nHow è 0, le successive ricevute sul socket non saranno consentite. Questo non ha alcun effetto sui livelli di protocollo inferiori.

Per Transmission Control Protocol (TCP), la finestra TCP non viene modificata e i dati in ingresso verranno accettati (ma non riconosciuti) fino all'esaurimento della finestra. Per User Datagram Protocol (UDP), i datagrammi in ingresso vengono accettati e accodati. In nessun caso verrà generato un pacchetto di errore ICMP. Se nHow è 1, gli invii successivi non sono consentiti. Per i socket TCP, verrà inviato un FIN. L'impostazione su nHow 2 disabilita sia gli invii che i messaggi ricevuti come descritto in precedenza.

Si noti che ShutDown non chiude il socket e le risorse collegate al socket non verranno liberate fino a quando Close non viene chiamato. Un'applicazione non deve basarsi sulla possibilità di riutilizzare un socket dopo l'arresto. In particolare, non è necessaria un'implementazione di Windows Sockets per supportare l'uso di Connect su un socket di questo tipo.

Esempio

Vedere l'esempio per CAsyncSocket::OnReceive.

CASyncSocket::Socket

Alloca un handle socket.

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);

Parametri

nSocketType
Specifica SOCK_STREAM o SOCK_DGRAM.

lEvent
Maschera di bit che specifica una combinazione di eventi di rete in cui l'applicazione è interessata.

  • FD_READ: si vuole ricevere una notifica di idoneità per la lettura.

  • FD_WRITE: si vuole ricevere una notifica di idoneità per la scrittura.

  • FD_OOB: si vuole ricevere una notifica dell'arrivo dei dati fuori banda.

  • FD_ACCEPT: si vuole ricevere una notifica delle connessioni in ingresso.

  • FD_CONNECT: si vuole ricevere la notifica della connessione completata.

  • FD_CLOSE: si vuole ricevere una notifica di chiusura del socket.

nProtocolType
Protocollo da usare con il socket specifico della famiglia di indirizzi indicata.

nAddressFormat
Specifica della famiglia di indirizzi.

Valore restituito

Restituisce TRUE in caso di esito positivo, FALSE in caso di errore.

Osservazioni:

Questo metodo alloca un handle socket. Non chiama CAsyncSocket::Bind per associare il socket a un indirizzo specificato, quindi è necessario chiamare Bind in un secondo momento per associare il socket a un indirizzo specificato. È possibile usare CAsyncSocket::SetSockOpt per impostare l'opzione socket prima di essere associata.

Vedi anche

CObject Classe
Grafico della gerarchia
CSocket Classe
CSocketFile Classe