Classe di CSocketFile
Un oggetto CFile utilizzato per l'invio e la ricezione dei dati tramite una rete mediante Windows Sockets.
class CSocketFile : public CFile
Membri
Costruttori pubblici
Nome |
Descrizione |
---|---|
Costruisce un oggetto CSocketFile. |
Note
È possibile associare l'oggetto CSocketFile a un oggetto CSocket a questo scopo.È anche possibile e generalmente accade, associare l'oggetto CSocketFile a un oggetto CArchive per semplificare l'invio e la ricezione dei dati mediante la serializzazione MFC.
Per serializzare (inviare i dati, la inserisce nell'archivio, che chiama le funzioni membro CSocketFile per scrivere i dati all'oggetto CSocket.Per deserializzare (ricevere i dati, vengono estratti dall'archivio.In questo modo il file a chiamare le funzioni membro CSocketFile per leggere i dati dall'oggetto CSocket.
![]() |
---|
Oltre a utilizzare CSocketFile come descritto di seguito, è possibile utilizzarlo come oggetto file autonomo, come accade per CFile, la classe di base.È inoltre possibile utilizzare CSocketFile con tutte le funzioni all'archivio di serializzazione MFC.Poiché CSocketFile non supporta tutte le funzionalità di CFile, alcune impostazione predefinita MFC serializza le funzioni non è compatibile con CSocketFile.Ciò è particolarmente vero per la classe CEditView.Non tentare di serializzare i dati CEditView tramite un oggetto CArchive associato a un oggetto CSocketFile utilizzando CEditView::SerializeRaw; utilizzo CEditView::Serialize anziché.La funzione SerializeRaw che l'oggetto file per avere funzioni, come Seek, che CSocketFile non ha. |
Quando si utilizza CArchive con CSocketFile e CSocket, potrebbe verificarsi una situazione in cui CSocket::Receive immette un ciclo (da PumpMessages(FD_READ)) che attende la quantità richiesta di byte.Questo perché i socket di Windows consente solo una chiamata di recv per notifica di FD_READ, ma CSocketFile e CSocket consentono più chiamate di recv per FD_READ.Se viene visualizzato un FD_READ quando non vi sono dati da leggere, verrà bloccato.Se non si ottengono mai un altro FD_READ, l'applicazione termina la sessione di per comunicare su socket.
È possibile risolvere questo problema come segue.Nel metodo OnReceive della classe di socket, chiamata CAsyncSocket::IOCtl(FIONREAD, ...) prima di chiamare il metodo Serialize della classe di messaggio quando i dati previsti da leggere da socket supera la dimensione di un pacchetto TCP (Maximum Transmission Unit il supporto della rete, in genere di almeno 1096 byte).Se la dimensione dei dati disponibili è minore di quello necessario, aspetti tutti i dati da ricevere solo e quindi avviare l'operazione di lettura.
Nell'esempio seguente, m_dwExpected è il numero di byte approssimativo che l'utente prevede di ricevere.Si presuppone che lo dichiara 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 ulteriori informazioni, vedere In Windows Sockets MFC, Windows Sockets: Utilizzo di socket con gli archivinonché Windows Sockets 2 API.
Gerarchia di ereditarietà
CSocketFile
Requisiti
Header: afxsock.h