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à
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 lpSockAddr
cui 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
è troppo piccolo (minore delle dimensioni di unaSOCKADDR
struttura).WSAEINPROGRESS
È in corso una chiamata di Windows Sockets bloccante.WSAEINVAL
Listen
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_STREAM
esempio .
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 positivoAfxSocketInit
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 positivoAfxSocketInit
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'opzioneSO_REUSEADDR
socket inSetSockOpt
.)WSAEFAULT
L'argomentonSockAddrLen
è troppo piccolo (minore delle dimensioni di unaSOCKADDR
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 GetSockOpt
membro .
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 WSAEWOULDBLOCK
e 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 positivoAfxSocketInit
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'argomentonSockAddrLen
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 positivoAfxSocketInit
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 vuotoCSocket
come parametro. È necessario costruire questo oggetto prima di chiamareAccept
. Tenere presente che se questo oggetto socket esce dall'ambito, la connessione si chiude. Non chiamareCreate
per questo nuovo oggetto socket.
Importante
Create
non è 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_hSocket
NULL
.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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
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 conBind
.
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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
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 conBind
.
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_LINGER
tutte le altre opzioni sarà la dimensione di un valore BOOL o , int
a 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpOptionLen
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 tipoSOCK_STREAM
, mentreSO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
, eSO_OOBINLINE
non sono supportati nei socket di tipoSOCK_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 | Type | 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 | Type | 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEINVAL
lCommand
non è un comando valido olpArgument
non è un parametro accettabile perlCommand
o 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. IllpArgument
parametro punta a unDWORD
oggetto , diverso da zero se la modalità non di blocco deve essere abilitata e zero se deve essere disabilitata. SeAsyncSelect
è stato emesso su un socket, qualsiasi tentativo di usareIOCtl
per impostare di nuovo il socket sulla modalità di blocco avrà esito negativo conWSAEINVAL
. Per ripristinare la modalità di blocco del socket e impedire l'erroreWSAEINVAL
, un'applicazione deve prima disabilitareAsyncSelect
chiamando con illEvent
parametro uguale a 0, quindi chiamareAsyncSelect
IOCtl
.FIONREAD
Determinare il numero massimo di byte che possono essere letti con unaReceive
chiamata da questo socket. IllpArgument
parametro punta a unDWORD
oggetto in cuiIOCtl
archivia il risultato. Se questo socket è di tipoSOCK_STREAM
,FIONREAD
restituisce la quantità totale di dati che possono essere letti in un singoloReceive
oggetto . In genere corrisponde alla quantità totale di dati accodati sul socket. Se questo socket è di tipoSOCK_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 tipoSOCK_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 successivoReceive
oReceiveFrom
eseguito sul socket recupererà alcuni o tutti i dati precedenti al "contrassegno". L'applicazione deve usare l'operazioneSIOCATMARK
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 unReceive
oggetto oReceiveFrom
non mixerà mai dati fuori banda e normali nella stessa chiamata. IllpArgument
parametro punta a unDWORD
oggetto in cuiIOCtl
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 positivoAfxSocketInit
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 oBind
è 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'operazioneListen
.
Osservazioni:
Per accettare le connessioni, il socket viene prima creato con Create
, viene specificato un backlog per le connessioni in ingresso con Listen
e 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'argomentolpSockAddrLen
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 CSocket
la 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 positivoAfxSocketInit
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.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareReceive
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 0 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazioneReceive
si blocca.WSAEMSGSIZE
Il datagramma era troppo grande per adattarsi al buffer specificato ed è stato troncato.WSAEINVAL
Il socket non è stato associato aBind
.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_OOBINLINE
socket ) 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
non è valido: illpSockAddr
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 aBind
.WSAENOTCONN
Il socket non è connesso (SOCK_STREAM
solo).WSAENOTSOCK
Il descrittore non è un socket.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareReceiveFrom
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 0 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazioneReceiveFrom
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_OOBINLINE
socket ) 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
L'argomentolpSockAddrLen
non è valido: illpSockAddr
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 aBind
.WSAENOTCONN
Il socket non è connesso (SOCK_STREAM
solo).WSAENOTSOCK
Il descrittore non è un socket.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareReceiveFromEx
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 0 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazioneReceiveFromEx
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_OOBINLINE
socket ) 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 positivoAfxSocketInit
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'argomentolpBuf
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.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareSend
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 1 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.WSAEMSGSIZE
Il socket è di tipoSOCK_DGRAM
e il datagramma è maggiore del massimo supportato dall'implementazione di Windows Sockets.WSAEINVAL
Il socket non è stato associato aBind
.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 GetLastError
e 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 positivoAfxSocketInit
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
IlpBuf
parametri olpSockAddr
non fanno parte dello spazio degli indirizzi utente o l'argomentolpSockAddr
è troppo piccolo (minore delle dimensioni di unaSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareSendTo
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 1 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.WSAEMSGSIZE
Il socket è di tipoSOCK_DGRAM
e 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.H
di 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 positivoAfxSocketInit
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
IlpBuf
parametri olpSockAddr
non fanno parte dello spazio degli indirizzi utente o l'argomentolpSockAddr
è troppo piccolo (minore delle dimensioni di unaSOCKADDR
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.WSAEOPNOTSUPP
MSG_OOB
è stato specificato, ma il socket non è di tipoSOCK_STREAM
.WSAESHUTDOWN
Il socket è stato arrestato; non è possibile chiamareSendToEx
su un socket dopoShutDown
che è stato richiamato connHow
impostato su 1 o 2.WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e l'operazione richiesta si blocca.WSAEMSGSIZE
Il socket è di tipoSOCK_DGRAM
e 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.H
di 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEFAULT
lpOptionValue
non è incluso in una parte valida dello spazio indirizzi del processo.WSAEINPROGRESS
È in corso un'operazione di blocco di Windows Sockets.WSAEINVAL
nLevel
non è valido oppure le informazioni contenute inlpOptionValue
non sono valide.WSAENETRESET
Timeout della connessione al momentoSO_KEEPALIVE
dell'impostazione.WSAENOPROTOOPT
L'opzione è sconosciuta o non supportata. In particolare,SO_BROADCAST
non è supportato nei socket di tipoSOCK_STREAM
, mentreSO_DONTLINGER
,SO_KEEPALIVE
SO_LINGER
, eSO_OOBINLINE
non sono supportati nei socket di tipoSOCK_DGRAM
.WSAENOTCONN
La connessione è stata reimpostata quandoSO_KEEPALIVE
è impostata.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 | Type | 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 | Type | 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 positivoAfxSocketInit
deve verificarsi prima di usare questa API.WSAENETDOWN
L'implementazione di Windows Sockets ha rilevato che il sottosistema di rete non è riuscito.WSAEINVAL
nHow
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