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. CSocket
usa 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
Costruire un oggetto CSocket .
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 unCSocket
oggetto server, è necessario specificare una porta nellaCreate
chiamata.Nota
CArchive
non funziona con i socket di datagramma. Se si desidera utilizzareCSocket
per un socket di datagramma, è necessario utilizzare la classe come se si utilizzasseCAsyncSocket
, 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 utilizzareCSocket
con un oggettoCArchive
per un datagramma, un'asserzione MFC non funziona.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 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.Creare un oggetto CSocketFile , associando l'oggetto
CSocket
.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.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 oggettiCArchive
: 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.
Eliminare definitivamente l'archivio, il file di socket e gli oggetti socket.
Nota
La classe
CArchive
fornisce la funzione membroIsBufferEmpty
in modo specifico per l'utilizzo con la classeCSocket
. 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. UtilizzareIsBufferEmpty
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: