Classe CSocketFile

Oggetto CFile utilizzato per l'invio e la ricezione di dati su una rete mediante Windows Sockets.

Sintassi

class CSocketFile : public CFile

Membri

Costruttori pubblici

Nome Descrizione
CSocketFile::CSocketFile Costruisce un oggetto CSocketFile.

Osservazioni:

A questo scopo, è possibile associare l'oggetto CSocketFile a un CSocket oggetto . È anche possibile, e in genere, collegare l'oggetto a un CArchive oggetto per semplificare l'invio CSocketFile e la ricezione di dati tramite la serializzazione MFC.

Per serializzare (inviare) i dati, inserirli nell'archivio, che chiama CSocketFile le funzioni membro per scrivere dati nell'oggetto CSocket . Per deserializzare (ricevere) i dati, estrarre dall'archivio. In questo modo l'archivio chiama CSocketFile le funzioni membro per leggere i dati dall'oggetto CSocket .

Suggerimento

Oltre a usare CSocketFile come descritto qui, è possibile usarlo come oggetto file autonomo, proprio come è possibile con CFile, la relativa classe di base. È anche possibile usare CSocketFile con qualsiasi funzione di serializzazione MFC basata su archivio. Poiché CSocketFile non supporta tutte le CFilefunzionalità di , alcune funzioni di serializzazione MFC predefinite non sono compatibili con CSocketFile. Questo è particolarmente vero della CEditView classe . Non è consigliabile provare a serializzare CEditView i dati tramite un CArchive oggetto associato a un CSocketFile oggetto utilizzando CEditView::SerializeRaw; utilizzare CEditView::Serialize invece . La SerializeRaw funzione prevede che l'oggetto file abbia funzioni, ad esempio Seek, che CSocketFile non dispone di .

Quando si usa CArchive con CSocketFile e CSocket, è possibile che si verifichi una situazione in cui CSocket::Receive entra in un ciclo (by PumpMessages(FD_READ)) in attesa della quantità richiesta di byte. Questo avviene perché i socket di Windows consentono una sola chiamata recv per notifica FD_READ, ma CSocketFile consentono CSocket più chiamate recv per FD_READ. Se si ottiene un FD_READ quando non sono presenti dati da leggere, l'applicazione si blocca. Se non si ottiene mai un altro FD_READ, l'applicazione smette di comunicare tramite il socket.

È possibile risolvere questo problema come indicato di seguito. OnReceive Nel metodo della classe socket chiamare CAsyncSocket::IOCtl(FIONREAD, ...) prima di chiamare il Serialize metodo della classe messaggio quando i dati previsti da leggere dal socket superano le dimensioni di un pacchetto TCP (unità di trasmissione massima del supporto di rete, in genere almeno 1096 byte). Se le dimensioni dei dati disponibili sono inferiori alle esigenze, attendere che tutti i dati vengano ricevuti e quindi avviare l'operazione di lettura.

Nell'esempio seguente è m_dwExpected il numero approssimativo di byte che l'utente si aspetta di ricevere. Si presuppone che venga dichiarata altrove nel codice.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

Per altre informazioni, vedere Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives , nonché Windows Sockets 2 API.

Gerarchia di ereditarietà

CObject

CFile

CSocketFile

Requisiti

Intestazione: afxsock.h

CSocketFile::CSocketFile

Costruisce un oggetto CSocketFile.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

Parametri

pSocket
Socket da collegare all'oggetto CSocketFile .

bArchiveCompatible
Specifica se l'oggetto file è da utilizzare con un CArchive oggetto . Passare FALSE solo se si desidera utilizzare l'oggetto CSocketFile in modo autonomo come si farebbe con un oggetto autonomo CFile , con determinate limitazioni. Questo flag modifica il modo in cui l'oggetto CArchive collegato all'oggetto gestisce il CSocketFile buffer per la lettura.

Osservazioni:

Il distruttore dell'oggetto annulla l'associazione dall'oggetto socket quando l'oggetto esce dall'ambito o viene eliminato.

Nota

Un CSocketFile oggetto può essere usato anche come file (limitato) senza un CArchive oggetto . Per impostazione predefinita, il CSocketFile parametro bArchiveCompatible del costruttore è TRUE. Specifica che l'oggetto file viene utilizzato con un archivio. Per usare l'oggetto file senza un archivio, passare FALSE nel parametro bArchiveCompatible .

Nella modalità "compatibile con l'archivio", un CSocketFile oggetto offre prestazioni migliori e riduce il rischio di un "deadlock". Un deadlock si verifica quando entrambi i socket di invio e ricezione sono in attesa l'uno sull'altro o per una risorsa comune. Questa situazione può verificarsi se l'oggetto CArchive ha lavorato con il CSocketFile modo in cui funziona con un CFile oggetto . Con CFile, l'archivio può presupporre che, se riceve meno byte rispetto a quanto richiesto, è stata raggiunta la fine del file.

Con CSocketFile, tuttavia, i dati sono basati su messaggi. Il buffer può contenere più messaggi, pertanto la ricezione di meno del numero di byte richiesti non implica la fine del file. L'applicazione non si blocca in questo caso come potrebbe con CFilee può continuare a leggere i messaggi dal buffer fino a quando il buffer non è vuoto. La funzione CArchive::IsBufferEmpty è utile per monitorare lo stato del buffer dell'archivio in questo caso.

Per altre informazioni sull'uso di , vedere gli articoli Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets Using Archives .For more information on the use , CSocketFilesee the articles Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets using Archives.

Vedi anche

Classe CFile
Grafico della gerarchia
Classe CAsyncSocket
Classe CSocket