Condividi tramite


Windows Sockets: utilizzo di socket con archivi

Questo articolo descrive il modello di programmazione CSocket. La classe CSocket fornisce il supporto socket a un livello superiore di astrazione rispetto alla classe CAsyncSocket. CSocketusa una versione del protocollo di serializzazione MFC per passare dati da e verso un oggetto socket tramite un oggetto CArchive MFC. CSocket fornisce il blocco (durante la gestione di elaborazione in background dei messaggi di Windows) e consente di accedere a CArchive, che gestisce molti aspetti della comunicazione che altrimenti occorrerebbe creare di persona utilizzando l'API non elaborata o la classe CAsyncSocket.

Suggerimento

È possibile utilizzare la classe CSocket da sola, come versione più semplice di CAsyncSocket, ma il modello di programmazione più semplice consiste nell'utilizzare CSocket con un oggetto CArchive.

Per altre informazioni sul funzionamento dell'implementazione di socket con archivi, vedere Windows Sockets: Funzionamento dei socket con archivi. Per un esempio di codice, vedere Windows Sockets: Sequenza di operazioni e Windows Sockets: esempio di socket che usano archivi. Per informazioni su alcune delle funzionalità che è possibile ottenere derivando classi personalizzate dalle classi socket, vedere Windows Sockets: Derivazione da classi socket.

Nota

Se si scrive un programma MFC client per comunicare con server consolidati (non MFC), non inviare oggetti C++ attraverso l'archivio. A meno che il server non sia un'applicazione MFC che individua i tipi di oggetti che si desidera inviare, non sarà possibile ricevere e deserializzare gli oggetti. Per materiale correlato sul tema della comunicazione con applicazioni non MFC, vedere anche l'articolo Windows Sockets: Byte Ordering.

Modello di programmazione CSocket

L'utilizzo di un oggetto CSocket implica la creazione e l'associazione di diversi oggetti classe MFC. Nella procedura generica indicata di seguito, ogni passaggio viene effettuato sia dal socket server sia dal socket client, ad eccezione del passaggio 3, in cui ciascun tipo di socket richiede un'azione diversa.

Suggerimento

In fase di esecuzione, l'applicazione server viene in genere avviata per prima in modo da essere pronta e "in ascolto" quando l'applicazione client cerca una connessione. Se il server non è pronto quando il client tenta di connettersi, in genere si richiede un nuovo tentativo di connessione da parte dell'applicazione dell'utente.

Per impostare la comunicazione tra un socket server e un socket client

  1. Costruire un oggetto CSocket .

  2. Utilizzare l'oggetto per creare l'handle SOCKET sottostante.

    Per un CSocket oggetto client, in genere è consigliabile usare i parametri predefiniti per Crea, a meno che non sia necessario un socket di datagrammi. Per un CSocket oggetto server, è necessario specificare una porta nella Create chiamata.

    Nota

    CArchive non funziona con i socket di datagramma. Se si desidera utilizzare CSocket per un socket di datagramma, è necessario utilizzare la classe come se si utilizzasse CAsyncSocket, ovvero, senza un archivio. Poiché i datagrammi sono inaffidabili (non è garantito l'arrivo e può essere ripetuto o fuori sequenza), non sono compatibili con la serializzazione tramite un archivio. Richiedere un'operazione di serializzazione per completare in modo affidabile e in sequenza. Se si tenta di utilizzare CSocket con un oggetto CArchive per un datagramma, un'asserzione MFC non funziona.

  3. Se il socket è un client, chiamare CAsyncSocket::Connessione per connettere l'oggetto socket a un socket del server.

    -oppure-

    Se il socket è un server, chiamare CAsyncSocket::Listen per iniziare ad ascoltare i tentativi di connessione da un client. Dopo aver ricevuto una richiesta di connessione, accettarla chiamando CAsyncSocket::Accept.

    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.

  4. Creare un oggetto CSocketFile , associando l'oggetto CSocket .

  5. Creare un oggetto CArchive per il caricamento (ricezione) o l'archiviazione di dati (invio). L'archivio è associato all'oggetto CSocketFile.

    Tenere presente che CArchive non funziona con i socket di datagramma.

  6. Utilizzare l'oggetto CArchive per passare dati tra i socket client e server.

    Tenere presente che un determinato oggetto CArchive converte i dati in una sola direzione: per il caricamento (ricezione) o l'archiviazione (invio). In alcuni casi, si utilizzeranno due oggetti CArchive: uno per inviare i dati, l'altro per ricevere messaggi di riconoscimento.

    Dopo avere accettato la connessione e l'installazione dell'archivio, è possibile eseguire attività come la convalida delle password.

  7. Eliminare definitivamente l'archivio, il file di socket e gli oggetti socket.

    Nota

    La classe CArchive fornisce la funzione membro IsBufferEmpty in modo specifico per l'utilizzo con la classe CSocket. Se il buffer contiene più messaggi di dati, ad esempio, è necessario eseguire un ciclo per leggerli tutti e liberare il buffer. In caso contrario, la successiva notifica di ricezione di dati potrebbe essere ritardata a tempo indeterminato. Utilizzare IsBufferEmpty per garantire il recupero di tutti i dati.

L'articolo Windows Sockets: Sequenza di operazioni illustra entrambi i lati di questo processo con codice di esempio.

Per altre informazioni, vedere:

Vedi anche

Windows Sockets in MFC
CSocket::Create