Sdílet prostřednictvím


Rozhraní Windows Sockets: Pořadí bytů

Tento článek a články dva Průvodce vyhledáváním popisují několik problémů v programování rozhraní Windows Sockets.Tento článek se zabývá pořadí bajtů.Další problémy, které jsou zahrnuty v článcích: rozhraní Windows Sockets: blokování a rozhraní Windows Sockets: převod řetězců.

Pokud nepoužíváte nebo odvozena od třídy CAsyncSocket, bude nutné spravovat tyto problémy sami.Pokud nepoužíváte nebo odvozena od třídy CSocket, MFC spravuje, je pro vás.

Pořadí bytů

Architektury počítačů různých někdy ukládají data pomocí různých bajt objednávek.Například počítačů platformy Intel ukládat data v obráceném pořadí počítačů Macintosh (Motorola).Pořadí bajtů Intel, nazývané "little-Endian, je také zpětné objednávky sítě standardní"big-Endian.Následující tabulka vysvětluje tyto podmínky.

Pořadí bytů big a Little-Endian

Pořadí bytů

Význam

Big-Endian

Nejvýznamnější bajt je na levém konci slova.

Little-Endian

Nejvýznamnější bajt je na pravém konci slova.

Obvykle nemusíte obávat převod pořadí bytů pro data odesílat a přijímat prostřednictvím sítě, ale existují situace, ve kterých je nutné převést bajt objednávky.

Musí při převodu bajt objednávky

Potřebujete převést bajt objednávky v následujících situacích:

  • Jsou předávání informací, které musí být interpretovány sítě, na rozdíl od dat odesílaného do jiného počítače.Například může předat porty a adresy, které musí porozumět sítě.

  • Serverová aplikace, se kterým komunikujete, není aplikace MFC (a nemáte jeho zdrojový kód).Pokud dva počítače sdílet stejné pořadí bajtů volá pro převody pořadí bajtů.

Pokud není nutné převést bajt objednávky

Chcete-li se vyhnout práci převádění bajt objednávek v následujících situacích:

  • Stroje na obou koncích můžete souhlasit není zaměnit bajtů a oba počítače používají stejné pořadí bajtů.

  • Aplikace MFC je server, který komunikuje se.

  • Zdrojový kód pro server, který komunikujete, máte tak můžete explicitně zjistit, zda je nutné převést bajt objednávky nebo ne.

  • Můžete port serveru MFC.To je poměrně snadné a výsledkem je obvykle menší a rychlejší kód.

Práce s CAsyncSocket, musí všechny převody nezbytné pořadí bajtů spravovat sami.Rozhraní Windows Sockets standardizuje modelu pořadí bajtů "big-Endian a poskytuje funkce převodu mezi tuto objednávku a jiné.CArchive, ale které použít s CSocket, používá v opačném pořadí ("little-Endian), ale CArchive stará o podrobnosti o převodech pořadí bytů pro vás.Pomocí této standardní řazení v aplikacích nebo použitím funkce převodu rozhraní Windows Sockets pořadí bajtů, můžete vytvořit kód obecnější.

Pomocí soketů MFC ideální případ je při psaní oba konce komunikace: pomocí MFC na obou koncích.Pokud vytváříte aplikaci, která bude komunikovat bez MFC aplikací, jako například FTP server, bude pravděpodobně třeba spravovat bajt výměna sami před data předat objekt archivu pomocí převodu rutiny Windows Sockets ntohs, ntohl, htons, a htonl.Příkladem těchto funkcí v komunikaci s aplikací bez MFC, zobrazí se dále v tomto článku.

[!POZNÁMKA]

Konec komunikace není aplikace MFC, je také třeba se vyvarovat streaming objektů C++ odvozené z CObject do archivu protože příjemce nebude moci jejich zpracování.Viz poznámka v rozhraní Windows Sockets: pomocí soketů s archivy.

Další informace o objednávkách bajt viz specifikace rozhraní Windows Sockets v Windows SDK.

Příklad převodu pořadí bajtů

Následující příklad ukazuje funkci serializace CSocket objekt, který používá archivu.Ukazuje také pomocí funkcí pro převod pořadí bajtů v rozhraní Windows Sockets API.

Tento příklad představuje scénář, ve kterém píšete klient, který komunikuje s než MFC serverové aplikace, které nemají přístup ke zdrojovému kódu.V tomto případě Předpokládejme, že server není MFC používá standardní síťovém pořadí bajtů.Naopak klientské aplikace MFC používá CArchive objekt s CSocket objektu, a CArchive používá pořadí bajtů "little-Endian, opakem standard sítě.

Předpokládejme, že server není MFC, se kterým chcete komunikovat má zavedený protokol pro paket zprávy následujícím způsobem:

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

Z hlediska MFC to by vyjádřit takto:

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

    void Serialize( CArchive& ar );
};

V jazyce C++ struct je v podstatě stejný jako třída.Message Struktura může mít například funkce členů Serialize deklarované členské funkce výše.Serialize Členské funkce může vypadat například takto:

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

V tomto příkladu volá pro převody pořadí bajtů dat, protože vymazat Neshoda mezi pořadí bajtů než MFC serverové aplikace na jednom konci a CArchive v MFC klientské aplikace na druhém konci.Příklad ukazuje několik funkcí pro převod pořadí bajtů, které poskytuje rozhraní Windows Sockets.Následující tabulka popisuje tyto funkce.

Funkce Windows Sockets pořadí bajtů

Function

Účel

ntohs

Převeďte 16bitové množství z pořadí síťových bajtů hostitele pořadí bajtů (big-Endian a little Endian).

ntohl

Převeďte množství 32bitové pořadí síťových bajtů na hostitele pořadí bajtů (big-Endian a little Endian).

Htons

Převeďte 16bitové množství z hostitele pořadí bajtů pořadí síťových bajtů (little-Endian a big-Endian).

Htonl

Převeďte množství 32bitové hostitele pořadí bajtů a pořadí síťových bajtů (little-Endian a big-Endian).

Jiný bod v tomto příkladu je, že při použití soketu na konci komunikace je bez MFC aplikace, je třeba se vyvarovat něco následující:

ar << pMsg;

kde pMsg je ukazatel na objekt jazyka C++, odvozené od třídy CObject.Že navíc MFC informace související s objekty a server není rozumět, odešle, jako by byla aplikace MFC.

Více informací naleznete:

Viz také

Koncepty

Rozhraní Windows Sockets v MFC