Windows Sockets: Uso della classe CAsyncSocket
Questo articolo illustra come usare la classe CAsyncSocket
. Questa classe incapsula l'API Windows Sockets a un livello molto basso. CAsyncSocket
è destinato ai programmatori che conoscono in dettaglio le comunicazioni di rete, ma vogliono la comodità dei callback per la notifica degli eventi di rete. In base a questo presupposto, questo articolo fornisce solo istruzioni di base. È consigliabile prendere in considerazione l'uso CAsyncSocket
se si vuole che Windows Sockets sia facile gestire più protocolli di rete in un'applicazione MFC, ma non si vuole sacrificare la flessibilità. Si potrebbe anche pensare di ottenere una migliore efficienza programmando le comunicazioni più direttamente rispetto a quanto si potrebbe usare il modello alternativo più generale della classe CSocket
.
CAsyncSocket
è documentato nelle informazioni di riferimento MFC. Visual C++ fornisce anche la specifica Windows Sockets, disponibile in Windows SDK. I dettagli vengono lasciati all'utente. Visual C++ non fornisce un'applicazione di esempio per CAsyncSocket
.
Se non si è molto esperti sulle comunicazioni di rete e si vuole una soluzione semplice, usare la classe CSocket
con un CArchive
oggetto . Per altre informazioni, vedere Windows Sockets: Using Sockets with Archives .See Windows Sockets: Using Sockets with Archives for more information.
Questo articolo tratta:
Creazione e utilizzo di un
CAsyncSocket
oggetto .
Creazione e uso di un oggetto CAsyncSocket
Utilizzare CAsyncSocket
Costruire un
CAsyncSocket
oggetto e usare l'oggetto per creare l'handle sottostanteSOCKET
.La creazione di un socket segue il modello MFC di costruzione a due fasi.
Ad esempio:
CAsyncSocket sock; sock.Create(); // Use the default parameters
-oppure-
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
Il primo costruttore precedente crea un
CAsyncSocket
oggetto nello stack. Il secondo costruttore crea un oggettoCAsyncSocket
nell'heap. La primaCreate
chiamata precedente usa i parametri predefiniti per creare un socket di flusso. La secondaCreate
chiamata crea un socket di datagrammi con una porta e un indirizzo specificati. È possibile usare una delle dueCreate
versioni con entrambi i metodi di costruzione.I parametri da usare
Create
sono:Una "porta": un numero intero breve.
Per un socket del server, è necessario specificare una porta. Per un socket client, in genere si accetta il valore predefinito per questo parametro, che consente a Windows Sockets di selezionare una porta.
Tipo di socket:
SOCK_STREAM
(impostazione predefinita) oSOCK_DGRAM
.Un "indirizzo" del socket,
"ftp.microsoft.com"
ad esempio o"128.56.22.8"
.Questo è l'indirizzo IP (Internet Protocol) sulla rete. Probabilmente si farà sempre affidamento sul valore predefinito per questo parametro.
I termini "porta" e "indirizzo socket" sono illustrati in Windows Sockets: porte e indirizzi socket.
Se il socket è un client, connettere l'oggetto socket a un socket del server usando
CAsyncSocket::Connect
.-oppure-
Se il socket è un server, impostare il socket per iniziare l'ascolto (con
CAsyncSocket::Listen
) per i tentativi di connessione da un client. Dopo aver ricevuto una richiesta di connessione, accettarla conCAsyncSocket::Accept
.Dopo aver accettato una connessione, è possibile eseguire attività come la convalida delle password.
Nota
La
Accept
funzione membro accetta un riferimento a un nuovo oggetto vuotoCSocket
come parametro. È necessario costruire questo oggetto prima di chiamareAccept
. Se l'oggetto socket esce dall'ambito, la connessione verrà chiusa. Non chiamareCreate
per questo nuovo oggetto socket. Per un esempio, vedere l'articolo Windows Sockets: Sequenza di operazioni.Eseguire comunicazioni con altri socket chiamando le
CAsyncSocket
funzioni membro dell'oggetto che incapsulano le funzioni DELL'API Windows Sockets.Vedere la specifica e la classe
CAsyncSocket
Windows Sockets nella Guida di riferimento MFC.Eliminare definitivamente l'oggetto
CAsyncSocket
.Se è stato creato l'oggetto socket nello stack, il relativo distruttore viene chiamato quando la funzione contenitore esce dall'ambito. Se è stato creato l'oggetto socket nell'heap, usando l'operatore
new
, si è responsabili dell'uso dell'operatoredelete
per eliminare definitivamente l'oggetto.Il distruttore chiama la funzione membro dell'oggetto prima di
Close
distruggere l'oggetto.
Per un esempio di questa sequenza nel codice (in realtà per un CSocket
oggetto), vedere Windows Sockets: Sequence of Operations.
Responsabilità dell'utente CAsyncSocket
Quando si crea un oggetto della classe CAsyncSocket
, l'oggetto incapsula un handle di Windows SOCKET
e fornisce operazioni su tale handle. Quando si usa CAsyncSocket
, è necessario gestire tutti i problemi che possono verificarsi se si usa direttamente l'API. Ad esempio:
Scenari di "blocco".
Differenze di ordine dei byte tra i computer di invio e ricezione.
Conversione tra stringhe Unicode e multibyte character set (MBCS).
Per le definizioni di questi termini e informazioni aggiuntive, vedere Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.For definitions of these terms and additional information, see Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.
Nonostante questi problemi, la classe CAsyncSocket
può essere la scelta giusta se l'applicazione richiede tutta la flessibilità e il controllo che è possibile ottenere. In caso contrario, prendere in considerazione l'uso della classe CSocket
. CSocket
nasconde molti dettagli da te: pompa i messaggi di Windows durante le chiamate di blocco e ti dà accesso a CArchive
, che gestisce le differenze di ordine dei byte e la conversione di stringhe per te.
Per altre informazioni, vedere: