Aracılığıyla paylaş


Windows Yuvaları: Bayt sırası

Bu makale ve iki Yardımcısı makaleleri Windows Sockets programlama çeşitli sorunları açıklamaktadır.Bu makalede, bayt sırası kapsar.Diğer sorunlar makalelerinde ele alınmıştır: Windows Sockets: engelleme ve Windows Sockets: dönüştürme dizeleri.

Kullanıyorsanız veya sınıfından türeyen CAsyncSocket, bu sorunları kendiniz yönetmek istemektedir.Kullanıyorsanız veya sınıfından türeyen CSocket, mfc yönetir bunları sizin için.

Bayt sırası

Farklı makina mimarileri, bazen farklı bayt siparişler kullanarak verileri depolar.Örneğin, Intel tabanlı makineler (Motorola) Macintosh makineleri ters sırada verileri depolar.Intel bayt sırası "little-Endian," adlı ağ standart "big-Endian" sipariş tersi de olur.Bu terimler aşağıdaki tabloda açıklanmaktadır.

Büyük ve Little-Endian bayt sırası

Bayt sırası

Anlam

Big-Endian

Bir sözcük sol tarafta en önemli bayttır.

Little-Endian

Bir sözcüğü sağ tarafta en önemli bayttır.

Genelde ağ üzerinden gönderip veriler için bayt sırası dönüşümü hakkında endişelenmeniz gerekmez, ancak bazı durumlarda bayt siparişleri dönüştürmeniz gerekir.

Ne zaman bayt siparişleri dönüştürmelisiniz.

Aşağıdaki durumlarda bayt siparişleri dönüştürmeniz gerekir:

  • Başka bir makineye gönderdiğiniz verileri karşıt olarak ağ yorumlanması gereken bilgileri geçirdiğinizden.Örneğin, geçebilir bağlantı noktaları ve ağ anlamanız gereken adresler.

  • mfc uygulaması ile iletişim kuran sunucu uygulaması değildir (ve kaynak kodu için sizde değil).Bu, iki makine aynı bayt sırası paylaşmıyorsanız bayt sırası dönüştürmeleri için çağırır.

Ne zaman bayt siparişlerine dönüştürme gerekmez

Aşağıdaki durumlarda bayt siparişlerini dönüştürme işini önleyebilirsiniz:

  • Makineler iki bayt takas değil kabul ve her iki makine aynı bayt sırasını kullanır.

  • Kurduğunuz mfc uygulaması sunucusudur.

  • Açıkça, bayt siparişleri veya dönüştürmeniz gerekir olup olmadığını söyleyebilir böylece sunucu, iletişim için kaynak kodu vardır.

  • mfc sunucuya bağlantı noktası.Bunu yapmak oldukça kolaydır ve genellikle daha küçük ve daha hızlı kod sonucudur.

Çalışma CAsyncSocket, kendinizi tüm gerekli bayt sırası dönüşümleri yönetmelisiniz.Windows Sockets "big-Endian" bayt sırası modeli standartlaştıran ve bu sırada diğerleri arasında dönüştürme işlevleri sağlar.CArchive, ancak ile kullanabileceğiniz CSocket, karşıt ("little-Endian") sıralamayı kullanır ancak CArchive bayt sırası dönüştürme ayrıntılarını dikkate alır.Bu standart uygulamalarınızda sıralama veya Windows Sockets bayt sırası dönüştürme işlevleri kullanarak kullanarak, kodunuzun daha taşınabilir duruma getirebilirsiniz.

İletişimin her iki ucunun yazarken kullanarak mfc yuva için ideal durumdur: her iki uçta mfc kullanılarak.Bir ftp sunucusu gibi olmayan mfc uygulamaları muhtemelen gerekecektir bayt-kendinizi arşiv nesnesine veri aktarmak için önce takas yönetmek kuracağı bir uygulama yazıyorsanız, Windows Sockets dönüştürme yordamları kullanarak ntohs, ntohl, htons, ve htonl.Bu makalede kullanılan mfc uygulama ile iletişim kurarken bu işlevleri örneği görüntülenir.

[!NOT]

İletişimin diğer ucu mfc uygulaması olmadığı zaman da C++ nesneleri türetilen akış kaçınmanız gerekir CObject , arşiv halinde alıcı işlemeye olmayacağı için.Nota bakın Windows Sockets: kullanarak yuva arşivleri ile.

Windows Sockets belirtimi kullanılabilir bayt siparişler hakkında daha fazla bilgi için bkz: Windows SDK.

Bayt sırası dönüştürme örneği

Aşağıdaki örnek için seri hale getirme işlevini gösterir bir CSocket bir arşiv kullanan bir nesne.Bayt sırası dönüştürme işlevleri Windows Sockets API kullanarak da göstermektedir.

Bu örnek, kaynak koda erişimi yok mfc sunucu uygulaması ile iletişim kuran istemci yazıyorsanız senaryosu sunar.Bu senaryoda, mfc sunucu, standart ağ bayt sırası kullanır varsaymalıdır.Buna karşılık, mfc İstemci uygulamanızın kullandığı bir CArchive ile nesne bir CSocket nesnesi ve CArchive standart ağ tersi olan "little-Endian" bayt sırasını kullanır.

mfc sunucu iletişim kurmak düşündüğünüz aşağıdakine benzer bir ileti paketi için kurulan bir protokol olduğunu varsayın:

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

mfc açısından, bu şekilde ifade:

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

    void Serialize( CArchive& ar );
};

C++'da, bir struct bir sınıf olarak temelde aynı şey.Message Yapısı olabilir üye işlevleri gibi Serialize üye işlev bildirilen yukarıda.Serialize Üye işlev şuna benzeyebilir:

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

Bayt ucu mfc sunucu uygulamasının sıralama arasında düz bir uyuşmazlık olmadığından bu örnek veri bayt sırası dönüştürmeleri için çağırır ve CArchive karşı taraftaki mfc istemci uygulamasında kullanılır.Örnek birkaç Windows Sockets sağladığı bayt sırası dönüştürme işlevleri gösterir.Aşağıdaki tabloda, bu işlevler açıklanır.

Windows Sockets bayt sırası dönüştürme işlevleri

İşlev

Purpose

ntohs

16-Bit miktarı ağ bayt sırası ana bayt sırası (big-Endian için little-Endian) dönüştürün.

ntohl

32-Bit miktarı ağ bayt sırası ana bayt sırası (big-Endian için little-Endian) dönüştürün.

Htons

16-Bit miktarı ana bayt sırası ağ bayt sırası (little-Endian için big-Endian) dönüştürün.

Htonl

32-Bit miktarı ana bayt sırası ağ bayt sırası (little-Endian için big-Endian) dönüştürün.

Başka bir örnek bu iletişimin diğer ucundaki yuva uygulama mfc uygulama olduğunda, aşağıdakine benzer bir şeyi kaçınmanız gerekir noktasıdır:

ar << pMsg;

Burada pMsg sınıfından türetilmiş bir C++ nesnesi bir işaretçidir CObject.mfc uygulaması olsaydı olduğu gibi bu, nesneler ve sunucu ile ilişkili ek mfc bilgi anlamayacaktır gönderecektir.

Daha fazla bilgi için bkz:

Ayrıca bkz.

Kavramlar

mfc, Windows Sockets