Condividi tramite


Windows Sockets: Come socket con il lavoro degli archivi

Questo articolo illustra come un oggetto di CSocket , un oggetto di CSocketFile e un oggetto di CArchive combinati per semplificare l'invio e la ricezione di dati da un socket di windows.

L'articolo Windows Sockets: Esempio di socket utilizzando gli archivi verifica la funzione di PacketSerialize .L'oggetto del funzionamento di esempio di PacketSerialize molto simile a un oggetto dell'archivio passato a una funzione MFC serializzare .La differenza fondamentale è che per i socket, l'archivio è associata non a un oggetto standard di file C (in genere associato a un file su disco) ma a un oggetto di CSocketFile .Anziché connessione a un file su disco, l'oggetto di CSocketFile connette a CSocket un oggetto.

Un oggetto di CArchive gestisce un buffer.Quando il buffer di un archivio (inviando) archiviante è completo, un oggetto associato di CFile scrive il contenuto del buffer.Svuotare il buffer di un file allegato a un socket equivale a inviare un messaggio.Quando il buffer di un archivio di caricamento (ricevere) è completo, l'oggetto di CFile smette di lettura finché il buffer non sia ancora disponibile.

La classe CSocketFile deriva da CFile, ma non supporta le funzioni membro di file C come funzioni di posizionamento (Seek, GetLength, SetLength, e così via), il blocco viene eseguito (LockRange, UnlockRange), o la funzione di GetPosition .Qualsiasi oggetto di CSocketFile necessario effettuare consiste nello scrivere o leggere le sequenze di byte a CSocket associato un oggetto.Poiché un file non è implicito, operazioni quali Seek e GetPosition non hanno un significato.CSocketFile è derivato da CFile, pertanto in genere erediterebbe tutte queste funzioni membro.Per impedire questa, le funzioni membro non supportate di CFile sottoposte a override in CSocketFile per generare CNotSupportedException.

Le funzioni membro di chiamate dell'oggetto di CSocketFile del CSocket oggetto per inviare o ricevere i dati.

Nella figura seguente vengono illustrate le relazioni tra questi oggetti da entrambi i lati di comunicazione.

CArchive, CSocketFile e CSocket

CArchive, CSocketFile, CSocket

Lo scopo di questa complessità evidente è di salvaguardarsi dal rischio di necessità di gestire i dettagli di socket manualmente.Creazione di socket, il file e l'archivio quindi avviare invio e ricezione di dati inserendolo nell'archivio o estraendolo dall'archivio.CArchive, CSocketFilee CSocket gestisce i dettagli in background.

Un oggetto di CSocket è in realtà un oggetto a due stati: talvolta asincrono (lo stato normale) e talvolta sincrono.In lo stato asincrono, un socket possibile ricevere notifiche asincrone dal framework.Tuttavia, durante l'operazione come ricevere o inviare i dati di socket diventa sincrono.Ciò significa che il socket riceva notifiche asincrone non ulteriori fino a quando l'operazione sincrona non è stato completato.Poiché passa le modalità, è possibile, ad esempio, simile al seguente:

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

Se CSocket non è stato implementato come un oggetto a due stati, potrebbe essere possibile ricevere le notifiche aggiuntive per lo stesso tipo di evento mentre si sviluppa una notifica precedente.Ad esempio, è possibile ottenere una notifica di OnReceive mentre elaboravi OnReceive.Nel frammento di codice riportato sopra, estrarre str dall'archivio potrebbe causare la ricorsione.Passaggio degli stati, CSocket impedisce la ricorsione impedendo le notifiche aggiuntive.La regola generale non è notifiche all'interno delle notifiche.

[!NOTA]

CSocketFile può essere utilizzato come file (limitato) di una classe senza un oggetto di CArchive .Per impostazione predefinita, il parametro di bArchiveCompatible del costruttore di CSocketFile è TRUE.In questo modo viene specificato che l'oggetto file è con un archivio.Per utilizzare l'oggetto file senza un archivio, passare FALSE nel parametro di bArchiveCompatible .

Nella “modalità compatibilità di l„, un oggetto di CSocketFile offre prestazioni migliori e riduce il avviso “di un deadlock.„ Un deadlock si verifica quando sia i socket l'invio di ricezioni in attesa tra loro, o in attesa di una risorsa comune.Questa situazione può verificarsi se l'oggetto di CArchive funzioni con CSocketFile in modo analogo a quanto avviene con un oggetto di CFile .Con CFile, l'archivio possibile presupporre che se riceve byte meno che ha richiesto, il fine del file è stato raggiunto.Con CSocketFile, tuttavia, i dati vengono messaggio in base; il buffer può contenere più messaggi, pertanto la ricezione di inferiore al numero di byte necessari non implica fine del file.L'applicazione non si blocca in questo caso poiché potrebbe con CFilee può continuare a leggere i messaggi dal buffer fino a quando il buffer non sia vuoto.La funzione di IsBufferEmpty in CArchive è utile per monitorare lo stato del buffer vengono memorizzati in questo caso.

Per ulteriori informazioni, vedere Windows Sockets: Utilizzo di socket con gli archivi

Vedere anche

Riferimenti

CObject::Serialize

Concetti

In Windows Sockets MFC