Condividi tramite


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 uso di un oggetto CAsyncSocket

Utilizzare CAsyncSocket

  1. Costruire un CAsyncSocket oggetto e usare l'oggetto per creare l'handle sottostante SOCKET .

    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 oggetto CAsyncSocket nell'heap. La prima Create chiamata precedente usa i parametri predefiniti per creare un socket di flusso. La seconda Create chiamata crea un socket di datagrammi con una porta e un indirizzo specificati. È possibile usare una delle due Create 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) o SOCK_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.

  2. 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 con CAsyncSocket::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 vuoto CSocket come parametro. È necessario costruire questo oggetto prima di chiamare Accept. Se l'oggetto socket esce dall'ambito, la connessione verrà chiusa. Non chiamare Create per questo nuovo oggetto socket. Per un esempio, vedere l'articolo Windows Sockets: Sequenza di operazioni.

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

  4. 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'operatore delete 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:

Vedi anche

Windows Sockets in MFC