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 CFile
funzionalità 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à
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 CFile
e 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 , CSocketFile
see 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