Freigeben über


Windows Sockets: Bytereihenfolge

Dieser Artikel und zwei Begleit artikel beschreiben verschiedene Probleme bei der Windows Socket-Programmierung.In diesem Artikel wird Bytereihenfolge ab.Die anderen Probleme werden in den Artikeln behandelt: Windows-Sockets: Blockieren und Windows-Sockets: Konvertieren von Zeichenfolgen.

Wenn Sie von der Klasse ableiten oder CAsyncSocket verwenden, müssen Sie diese Probleme verwalten.Wenn Sie von der Klasse ableiten, oder verwenden CSocket MFC sie für Sie verwaltet.

Bytereihenfolge

Verschiedene Computer, der manchmal Architekturen Speicherung von Daten mit verschiedenen Bytereihenfolgen.Zum Beispiel Intel-basierte Computer speichern Benutzerdaten in umgekehrter Reihenfolge von Computern Macintoshs (Motorola).Die Intel-Bytereihenfolge namens "Little-Endian" ist auch die Umkehrung der Standardeinstellung für "Network" Big-Endian- Reihenfolge.In der folgenden Tabelle werden diese Ausdrücke.

Groß- und Little-Endian-Bytereihenfolge

Bytereihenfolge

Bedeutung

Big-Endian

Das höchstwertige Byte eines Worts links ist.

Little-Endian

Das höchstwertige Byte ist am rechten Ende eines Wortes.

In der Regel müssen Sie keine Bytereihenfolgen sowohl für Daten, die Sie über das Netzwerk senden und empfangen, es gibt jedoch Situationen, in denen Sie Bytereihenfolgen konvertieren müssen.

Wenn Sie Bytereihenfolgen konvertiert werden müssen

Sie müssen in den folgenden Situationen Bytereihenfolgen konvertieren:

  • Sie übergeben, die Informationen über das Netzwerk interpretiert werden muss, im Gegensatz zu den Daten, die Sie auf einem anderen Computer übertragen.Zum Beispiel können Sie Adressen und Anschlüsse, die über das Netzwerk verstehen muss.

  • Die Serveranwendung, mit der Sie kommunizieren, ist keine MFC-Anwendung (und haben Sie keinen Quellcode für diese).Diese Aufrufe für Bytereihenfolgen konvertierungen, wenn die beiden Computer nicht dieselbe Bytereihenfolge freigeben.

Wenn Sie müssen nicht Bytereihenfolgen

Sie können die Arbeitsschritte zum Konvertieren von Bytereihenfolgen in folgenden Situationen vermeiden:

  • Die Computer an beiden Enden können nicht auf " Ich stimme zu " klicken, Bytes auszulagern, und beide Computer verwenden die gleiche Bytereihenfolge.

  • Der Server, mit dem Sie kommunizieren, ist eine MFC-Anwendung.

  • Sie verfügen über Quellcode für den Server, mit dem Sie kommunizieren, daher können Sie explizit angeben, ob Sie Bytereihenfolgen konvertieren müssen oder nicht.

  • Sie können Port der Server mit MFC.Dies ist recht einfach durchführen, und das Ergebnis ist normalerweise kleinerer, schnellerer Code.

Arbeitend mit CAsyncSocket, müssen Sie alle notwendigen Bytereihenfolgen konvertierungen selbst verwalten.Windows-Sockets standardisiert das Modell "Big-Endian-" Bytereihenfolgen stellt Funktionen und zu konvertierende zwischen dieser Reihenfolge und anderen bereit.CArchive jedoch, die Sie mit CSocket verwenden, wird die entgegengesetzte ("Little-Endian") Reihenfolge CArchive, jedoch werden die Details von konvertierungen Bytereihenfolgen.Mit dieser Reihenfolge der Standard in Ihren Anwendungen verwenden oder Windows Socket-Bytereihenfolgen konvertierungsfunktionen können Sie den Code mithilfe portabler machen.

Die ideale Argument für die Verwendung von MFC-Sockets ist, wenn Sie beide Enden der Kommunikation schreiben: Using MFC an beiden Enden.Wenn Sie schreiben, muss eine Anwendung, die MFC-fremden Anwendungen, z. B. einen FTP-Server Sie sich wahrscheinlich BYTE Auslagerung verwalten, bevor Sie die Daten in das Archiv, Using Windows Socket-Konvertierungs routinen ntohs, ntohl, htons und htonl übermitteln.Ein Beispiel für diese Funktionen verwendet werden, die bei der Kommunikation mit einer MFC-fremde Anwendung weiter unten in diesem Artikel.

HinweisHinweis

Wenn das andere Ende der Kommunikation über keine MFC-Anwendung ist, müssen Sie auch streamende C++-Objekte vermeiden, die von CObject in das Archiv abgeleitet werden, weil der Empfänger nicht in der Lage ist, sie zu verarbeiten.Siehe den Hinweis in Windows-Sockets: Verwenden von Sockets mit Archiven.

Weitere Informationen über Bytereihenfolgen finden Sie auf der Windows Socket-Spezifikation, die in Windows SDK verfügbar ist.

Ein Bytereihenfolgen-Konvertierungs-Beispiel

Im folgenden Beispiel wird eine Serialisierung für ein Feature CSocket-Objekt an, das ein Archiv verwendet.Es wird auch mithilfe der Bytereihenfolgen konvertierungsfunktionen in Windows Sockets API.

Dieses Beispiel stellt ein Szenario dar, in dem Sie einen Client schreiben, der mit einer MFC-fremden Serveranwendung kommuniziert, für die Sie keinen Zugriff auf den Quellcode haben.In diesem Szenario müssen Sie davon ausgehen, dass der MFC-fremde Server Standard netzwerk-bytereihenfolge verwendet.Im Gegensatz dazu verwendet die MFC-Clientanwendung ein CArchive-Objekt mit einem CSocket-Objekt, und CArchive verwendet "Little-Endian-" Bytereihenfolge, das Gegenteil des Netzwerk.

Angenommen, der MFC-fremde Server, mit dem Sie kommunizieren, zu eingerichtetes Meldung ein Protokoll für ein Paket wie folgt:

struct Message
{
   long MagicNumber;
   unsigned short Command;
   short Param1;
   long Param2;
};

In MFC-Ausdrücken würde dies angegeben, wie folgt:

struct Message
{
    long m_lMagicNumber;
    short m_nCommand;
    short m_nParam1;
    long m_lParam2;

    void Serialize( CArchive& ar );
};

In C++ ist struct im Wesentlichen die gleiche Aufgabe wie eine Klasse.Die Message-Struktur kann Memberfunktionen, wie die Serialize-Memberfunktion haben, die deklariert wird.Die Serialize-Memberfunktion formuliert werden:

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);
    }
}

Aufrufe dieses Beispiels für Bytereihenfolgen konvertierungen von Daten, da es sich um einen klaren Konflikt zwischen der Serveranwendung MFC-fremden der Bytereihenfolge am Ende und CArchive, das in der MFC-Clientanwendung am anderen Ende verwendete vorhanden ist.Das Beispiel zeigt mehrere Bytereihenfolgen konvertierungsfunktionen dass Windows Socket-Zubehör.In der folgenden Tabelle werden diese Features.

Windows Socket-Bytereihenfolgen-Konvertierungsfunktionen

Funktion

Zweck

ntohs

Konvertieren einer 16-Bit-Menge aus der Netzwerk-Bytereihenfolge in die Host-Bytereihenfolge (Big-Endian um Little-Endian).

ntohl

Konvertieren einer 32-Bit-Menge aus der Netzwerk-Bytereihenfolge in die Host-Bytereihenfolge (Big-Endian um Little-Endian).

Htons

Konvertieren einer 16-Bit-Menge aus der Host-Bytereihenfolge in die Netzwerk-Bytereihenfolge (Big-Endian dem Little-Endian).

Htonl

Konvertieren einer 32-Bit-Menge aus der Host-Bytereihenfolge in die Netzwerk-Bytereihenfolge (Big-Endian dem Little-Endian).

Ein anderer Stelle dieses Beispiels besteht darin, dass, wenn die Socket-Anwendung am anderen Ende der Kommunikation eine MFC-fremde Anwendung ist Sie in etwa folgendermaßen vermieden werden müssen:

ar << pMsg;

Dabei pMsg Ein Zeiger auf ein Objekt handelt, das von der C++-Compiler CObject-Klasse abgeleitet ist.Dieses sendet zusätzliche MFC-Informationen, die mit Objekten zugeordnet sind und der Server versteht diese nicht, wie er wurde, wenn es sich um eine MFC-Anwendung war.

Weitere Informationen finden Sie unter:

Siehe auch

Konzepte

Windows Sockets in MFC