Windows Sockets: Esempio di socket utilizzando gli archivi
In questo articolo viene riportato un esempio di classe CSocketutilizzando.L'esempio utilizza oggetti di CArchive per serializzare i dati mediante un socket.Si noti che non si tratta di serializzazione del documento o a un file.
Nell'esempio seguente viene illustrato come utilizzare l'archivio per inviare e ricevere i dati tra gli oggetti di CSocket .Progettare l'esempio in modo da due istanze di trasferimento di dati dell'applicazione sullo stesso computer o in diversi computer nella rete).Un'istanza invia i dati, che l'altra istanza riceve e riconosciuto.Qualsiasi applicazione possibile avviare uno scambio e spostandosi può essere utilizzato come server o come client all'altra applicazione.La seguente funzione è definita nella classe di visualizzazione dell'applicazione:
void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
BYTE bValue = 0;
WORD nCopies = 0;
if (arData.IsStoring())
{
CString strText;
errno_t err;
unsigned int number;
for(int p = 0; p < nPackets; p++)
{
err = rand_s(&number);
// if (err == 0)...
bValue = (BYTE)(number%256);
err = rand_s(&number);
// if (err == 0)...
nCopies = (WORD)(number%32000);
// Send header information
arData << bValue << nCopies;
for(int c = 0; c < nCopies; c++)
{
// Send data
arData << bValue;
}
strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
p + 1, nPackets, (int)bValue, nCopies);
// Send receipt string
arData << strText;
arData.Flush();
// Receive acknowledgment
arAck >> strText;
// display it
DisplayMessage(strText);
}
}
else
{
CString strText;
BYTE bCheck;
for(int p = 0; p < nPackets; p++)
{
// Receive header information
arData >> bCheck >> nCopies;
for(int c = 0; c < nCopies; c++)
{
// Receive data
arData >> bValue;
if (bCheck != bValue)
{
AfxMessageBox(_T("Packet Failure"));
}
}
// Receive receipt string and display it
arData >> strText;
DisplayMessage(strText);
strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"),
p + 1, nPackets, (int)bValue, nCopies);
// Send acknowledgment
arAck << strText;
arAck.Flush();
}
}
}
La maggior parte degli elementi importante su questo esempio è che i relativi paralleli della struttura di un MFC Serialize eseguire.La funzione membro di PacketSerialize è costituita da un'istruzione di if con una clausola di else .La funzione riceve due riferimenti di CArchive come parametri: arData e arAck.Se l'oggetto dell'archivio di arData è impostato per archiviare (inviare), il ramo di if esegue; in caso contrario, se arData è impostato per il caricamento (ricevere) la funzione accetta il ramo di else .Per ulteriori informazioni sulla serializzazione in MFC, vedere serializzazione.
[!NOTA]
L'oggetto dell'archivio di arAck sia l'opposto di arData.Se arData è per inviare, arAck riceve e contrario è true.
Per inviare, la funzione di esempio viene eseguito un ciclo per un determinato numero di volte, ogni volta generando dati casuali a scopo dimostrativo.L'applicazione otterrà dati reali in un'origine, ad esempio un file.L'operatore di inserimento dell'archivio di arData (<<) viene utilizzato per inviare un flusso di tre blocchi consecutivi di dati:
“Intestazione„ che specifica la tipologia dei dati (in questo caso, il valore della variabile di bValue e il numero di copie verranno inviate).
Entrambi gli elementi vengono generati casualmente per questo esempio.
Il numero specificato delle copie dei dati.
Il ciclo interno di for invia bValue il numero di volte specificato.
Una stringa ha chiamato strText visualizzato dal ricevitore all'utente.
Per ricevere, la funzione viene eseguita nello stesso modo, con la differenza che utilizza l'operatore di estrazione dell'archivio (>>) per ottenere i dati dall'archivio.L'applicazione di ricezione verifica i dati che riceve, verrà visualizzato il messaggio “ha„ finale e quindi restituisce un messaggio che indica “inviato„ per l'applicazione di invio visualizzare.
In questo modello di comunicazione, la parola “ha ricevuto„, il messaggio inviato nella variabile di strText , è per la visualizzazione all'altra estremità di comunicazione, pertanto specifica all'utente di ricezione che un determinato numero di pacchetti di dati sono stati ricevuti.Il ricevitore risponde a una stringa simile che indica “inviato„, per visualizzazione sullo schermo originale del mittente.La ricezione di entrambe le stringhe indica che la riuscita comunicazione si è verificata.
Attenzione |
---|
Se si scrive un MFC il programma client per comunicare con i server consolidato (non MFC), non inviare oggetti C++ nell'archivio.A meno che il server sia un'applicazione MFC che individua i tipi di oggetti si desidera inviare, non sarà possibile ricevere e deserializzare gli oggetti.Un esempio nell'articolo Windows Sockets: ordinamento di byte illustrata una comunicazione di questo tipo. |
Per ulteriori informazioni, vedere la specifica di Windows Sockets: htonl, htons, ntohl, ntohs.Inoltre, per ulteriori informazioni, vedere: