Windows Sockets: ordinamento di byte
In questo articolo e due articoli correlati vengono illustrati diversi problemi nella programmazione di Windows Sockets.In questo articolo riguarda l'ordinamento di byte.Le altre problematiche vengono analizzate articoli: Windows Sockets: blocco e Windows Sockets: Conversione delle stringhe.
Se si utilizza o derivata dalla classe CAsyncSocket, sarà necessario gestire questi problemi manualmente.Se si utilizza o derivata dalla classe CSocket, MFC le gestisce automaticamente.
Ordinamento di byte
Di architetture dati su computer diversi dell'archivio talvolta utilizzando gli ordini di byte diversi.Ad esempio, a dati basati su Intel dell'archivio dei computer dell'ordine inverso i computer Macintosh (Motorola).L'ordine di byte Intel, denominato “little-endian,„ è l'opposto dell'ordine “Big Endian„ standard di rete.Nella tabella seguente vengono descritti questi termini.
Ordinamento di byte grande e little-endian
Ordinamento di byte |
Significato |
---|---|
Big endian |
Il byte più significativo consiste alle estremità sinistra di una parola. |
Little-endian |
Il byte più significativo consiste alle estremità destra di una parola. |
In genere, non è necessario preoccuparsi di conversione di ordine dei byte per i dati inviati e viene visualizzato in rete, vi sono casi in cui è necessario convertire gli ordini di byte.
Quando è necessario convertire gli ordini di byte
È necessario convertire gli ordini di byte nelle seguenti situazioni:
Si sta passando le informazioni che devono essere interpretate dalla rete, in contrapposizione ai dati che si inviano a un altro computer.Ad esempio, è possibile passare le porte e gli indirizzi, che la rete necessario comprendere.
L'applicazione server con cui si comunicazione non è un'applicazione MFC (e non sono codice sorgente per).Questo richieste per le conversioni di ordine dei byte se i due computer non condividono lo stesso tipo di byte.
Quando non è necessario convertire gli ordini di byte
È possibile evitare lavoro di convertire gli ordini di byte nelle seguenti situazioni:
I computer a entrambe le estremità possono acconsentire per non lo scambio dei byte ed entrambi i computer utilizzano lo stesso ordine dei byte.
Il server che si sta comunicazione con è un'applicazione MFC.
Il codice sorgente per il server che si sta comunicazione con, pertanto è possibile impostare in modo esplicito se è necessario convertire gli ordini di byte o meno.
È possibile trasferire il server a MFC.Ciò è abbastanza facile eseguire e il risultato è codice in genere più piccolo e più rapido.
Utilizzo di CAsyncSocket, è necessario gestire tutte le conversioni necessarie per l'ordine dei byte manualmente.Windows Sockets standardizza il modello “Big Endian„ ordine dei byte e fornisce funzioni per la conversione tra questo ordine e altri.CArchive, tuttavia, di utilizzare con CSocket, utilizza (“little-endian„) ordine opposto, ma CArchive consente infatti dei dettagli delle conversioni di ordine dei byte automaticamente.Utilizzando questo ordine standard nelle applicazioni, utilizzando le funzioni di conversione ordine dei byte di Windows Sockets, è possibile rendere il codice più portabile.
L'argomento ideale per implementare sockets MFC è quando si scrivono entrambe le estremità di comunicazione: utilizzo di MFC a entrambe le estremità.Se si scrive un'applicazione che comunicherà con le applicazioni non MFC, ad esempio un server FTP, è probabile che dovrà gestire byte-scambiarsi prima di passare i dati all'oggetto dell'archivio, utilizzando le routine di conversione di Windows Sockets ntohs, ntohl, htonse htonl.Un esempio di queste funzioni utilizzate nella comunicazione con un'applicazione non MFC viene visualizzata più avanti in questo articolo.
[!NOTA]
Quando altra estremità di comunicazione non è un'applicazione MFC, è inoltre necessario evitare trasmettere oggetti C++ derivati da CObject nell'archivio perché il ricevitore non sarà in grado di gestirli.Vedere la nota in Windows Sockets: Utilizzo di socket con gli archivi.
Per ulteriori informazioni sugli ordini di byte, vedere la specifica di Windows Sockets, disponibile in Windows SDK.
Un esempio di conversione di ordine dei byte
Nell'esempio seguente viene illustrata una funzione di serializzazione per un oggetto di CSocket che utilizza un archivio.Viene illustrato l'utilizzo delle funzioni di conversione ordine dei byte in Windows Sockets API.
In questo esempio sono presenti uno scenario in cui si scrive un client che comunica con un'applicazione server non MFC per cui non si dispone di accesso al codice sorgente.In questo scenario, è necessario che il server non MFC utilizza l'ordine dei byte di rete standard.Al contrario, l'applicazione client MFC utilizza un oggetto di CArchive con un oggetto di CSocket e l'ordine di byte little-endian “„ dell'CArchive , l'opposto standard di rete.
Si supponga che il server non MFC con cui si desidera comunicare con un protocollo stabilito per un pacchetto del messaggio seguente:
struct Message
{
long MagicNumber;
unsigned short Command;
short Param1;
long Param2;
};
In termini di MFC, è espresso come segue:
struct Message
{
long m_lMagicNumber;
short m_nCommand;
short m_nParam1;
long m_lParam2;
void Serialize( CArchive& ar );
};
In C++, struct è essenzialmente la stessa definizione di classe.La struttura di Message può avere funzioni membro, come la funzione membro di Serialize dichiarata in.La funzione membro di Serialize potrebbe essere simile alla seguente:
void Message::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << (DWORD)htonl(m_lMagicNumber);
ar << (WORD)htons(m_nCommand);
ar << (WORD)htons(m_nParam1);
ar << (DWORD)htonl(m_lParam2);
}
else
{
WORD w;
DWORD dw;
ar >> dw;
m_lMagicNumber = ntohl((long)dw);
ar >> w ;
m_nCommand = ntohs((short)w);
ar >> w;
m_nParam1 = ntohs((short)w);
ar >> dw;
m_lParam2 = ntohl((long)dw);
}
}
Requisiti di questo esempio per le conversioni di ordine dei byte di dati perché c'è un chiaro mancata corrispondenza tra l'ordine di byte dell'applicazione server non MFC su un'estremità e CArchive utilizzato nell'applicazione client MFC per l'altra terminano.Nell'esempio sono illustrate diverse della conversione dell'ordine dei byte funzioni che fornisce Windows Sockets.Nella tabella seguente vengono illustrate queste funzioni.
Funzioni di conversione ordine dei byte di Windows Sockets
Funzione |
Scopo |
---|---|
ntohs |
Convertire una quantità a 16 bitordine dei byte di rete di ospitare l'ordine di byte (big endian a little-endian). |
ntohl |
Convertire una quantità a 32 bitordine dei byte di rete di ospitare l'ordine di byte (big endian a little-endian). |
Htons |
Convertire una quantità a 16 bit mediante l'ordine di byte host all'ordine dei byte di rete (little-endian al big endian). |
Htonl |
Convertire una quantità a 32 bit mediante l'ordine di byte host all'ordine dei byte di rete (little-endian al big endian). |
Un altro punto di questo esempio è che quando l'applicazione di socket sull'altra estremità di comunicazione è un'applicazione non MFC, è necessario evitare di eseguire simile al seguente:
ar << pMsg;
dove pMsg è un puntatore all'oggetto C++ derivato dalla classe CObject.Ciò invierà le informazioni aggiuntive MFC associate agli oggetti e il server non si capirà, come se fosse un'applicazione MFC.
Per ulteriori informazioni, vedere: