Condividi tramite


Windows Sockets: ordinamento dei byte

Questo articolo e due articoli correlati vengono illustrati diversi problemi nella programmazione Windows Sockets. Questo articolo riguarda l'ordinamento di byte. Gli altri problemi vengono analizzati negli articoli: Windows Sockets: Blocco e Windows Sockets: Conversione di stringhe.

Se si utilizza o derivate dalla classe CAsyncSocket, sarà necessario gestire questi problemi. Se si utilizza o derivate dalla classe CSocket, MFC li gestisce automaticamente.

Ordinamento di byte

Dati di architetture di computer diverso talvolta utilizzando gli ordini dei byte diversi. Ad esempio, per memorizzare dati basati su Intel dei computer dell'ordine inverso i computer Macintosh (Motorola). L'ordine dei byte Intel, denominato "little-endian," è anche l'operazione inversa dell'ordine "Big Endian" standard di rete. Nella tabella seguente vengono descritti questi termini.

Ordinamento di grandi dimensioni e byte little-endian

Ordinamento di byte

Significato

Big endian

Il byte più significativo all'estremità sinistra di una parola.

Little-endian

Il byte più significativo all'estremità destra di una parola.

In genere, non è necessario preoccuparsi di conversione di ordine dei byte per i dati inviati e viene visualizzato sulla rete, ma in alcune situazioni è necessario convertire gli ordini dei byte.

Quando è necessario convertire gli ordini dei byte

È necessario convertire gli ordini dei byte nelle seguenti situazioni:

  • Si sta passando le informazioni che devono essere interpretate dalla rete, anziché i dati che si inviano in un altro computer. Ad esempio, è possibile passare le porte e indirizzi, che la rete deve 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 dei byte

È possibile evitare lavoro di conversione degli ordini dei byte nelle seguenti situazioni:

  • I computer in entrambe le estremità possono per acconsentire non lo scambio dei byte e 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 dei byte o meno.

  • È possibile trasferire il server a MFC. Questa operazione è piuttosto 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. Windows Sockets standardizza il modello "Big Endian" per l'ordine dei byte e funzioni a conversione tra questo ordine e altri. CArchive, tuttavia, utilizzata con CSocket, utilizza little-endian ("") l'ordine opposto, ma CArchive consente infatti dei dettagli delle conversioni di ordine dei byte automaticamente. Utilizzando questo ordine standard nelle applicazioni, oppure mediante le funzioni di conversione di ordine dei byte Windows Sockets, è possibile rendere il codice più portabile.

Il caso ideale per l'utilizzo di sockets MFC è quando si scrivono entrambe le estremità di comunicazione: usando MFC su 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 store, utilizzando le routine di conversione Windows Sockets ntohs, ntohl, htons e htonl. Un esempio di queste funzioni utilizzate in comunicazione con un'applicazione MFC non viene visualizzata più avanti in questo articolo.

Nota

Quando l'altra estremità di comunicazione non è un'applicazione MFC, è inoltre necessario evitare degli 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 dei 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 anche l'utilizzo delle funzioni di conversione di 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 considerare 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 "" di utilizzare di CArchive, l'opposto standard di rete.

Si supponga che il server non MFC con cui si desidera comunicare con un protocollo set 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 precedenza. 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é è un semplice 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 estremità. Nell'esempio sono illustrate diverse della conversione di ordine dei byte che funziona con Windows Sockets. Nella tabella seguente vengono descritte queste funzioni.

Funzioni di conversione di ordine dei byte Windows Sockets

Funzione

Scopo

ntohs

Convertire una quantità a 16 bit mediante l'ordine di byte di rete di ospitare l'ordine dei byte (big endian a little-endian).

ntohl

Convertire una quantità a 32 bit mediante l'ordine di byte di rete di ospitare l'ordine dei byte (big endian a little-endian).

Htons

Convertire una quantità a 16 bit mediante l'ordine di byte host in ordine dei byte di rete (little-endian al big endian).

Htonl

Convertire una quantità a 32 bit mediante l'ordine di byte host in ordine dei byte di rete (little-endian al big endian).

Un altro punto di questo esempio è che quando l'applicazione di socket nell'altra estremità di comunicazione è un'applicazione non MFC, è necessario evitare di eseguire simile al seguente:

ar << pMsg;

dove pMsg è un puntatore a un oggetto c++ derivato dalla classe CObject. Ciò invierà informazioni aggiuntive MFC associati agli oggetti e il server non si capirà, come se fosse un'applicazione MFC.

Per ulteriori informazioni, vedere:

Vedere anche

Concetti

Windows Sockets in MFC