Windows Sockets: Kolejność bajtów
W tym artykule i dwa artykuły companion wyjaśnić kilka problemów programowania Windows Sockets.W tym artykule omówiono, kolejność bajtów.Inne kwestie objęte są w artykułach: Windows Sockets: blokowanie i Windows Sockets: Konwertowanie ciągów.
Jeśli jest używany lub pochodzić od klasy CAsyncSocket, musisz samodzielnie zarządzać tych problemów.Jeśli jest używany lub pochodzić od klasy CSocket, MFC zarządza je dla Ciebie.
Kolejność bajtów
Architektura różnych komputerów czasami przechowywanie danych za pomocą różnych bajt zamówienia.Na przykład komputerów opartych na architekturze Intel przechowywać dane w odwrotnej kolejności komputerów Macintosh (Motorola).Kolejność bajtów Intel, nazywany "little-Endian," jest także odwrotnej kolejności "big-Endian" standard sieci.W poniższej tabeli opisano te warunki.
Kolejność bajtów big - i Little-Endian
Kolejność bajtów |
Znaczenie |
---|---|
Big-Endian |
Najbardziej znaczący bajt znajduje się na lewym końcu wyrazu. |
Little-Endian |
Najbardziej znaczący bajt znajduje się na prawym końcu wyrazu. |
Zazwyczaj nie trzeba się martwić o konwersji kolejność bajtów danych wysyłanych i odbieranych z sieci, ale istnieją sytuacje, w których należy przekonwertować bajt zamówienia.
Kiedy należy przekonwertować bajt zamówień
Należy przekonwertować bajt zamówień w następujących sytuacjach:
Są przekazywanie informacji, która musi być interpretowane przez sieć, w przeciwieństwie do danych, które wysyłasz do innego komputera.Na przykład, może przekazać portów i adresów, które należy poznać sieci.
Aplikacja serwera, z którym jest nawiązywana komunikacja nie jest aplikacja MFC (i nie ma kodu źródłowego dla niego).Wymaga to konwersje kolejności bajtów, jeśli dwa komputery nie udostępniaj tej samej kolejności bajtów.
Gdy nie trzeba przekonwertować bajt zamówień
Można uniknąć pracy konwertowanie bajt zamówień w następujących sytuacjach:
Maszyny na obu końcach można zaakceptować nie swap bajtów i obie maszyny używać tej samej kolejności bajtów.
Serwer, z którym jest nawiązywana komunikacja jest aplikacja MFC.
Masz kod źródłowy dla serwera, na którym jest nawiązywana komunikacja, dzięki czemu można sprawdzić jawnie czy należy przekonwertować bajt zamówienia lub nie.
Można portu serwera do MFC.Jest to dość proste, a wynik jest zazwyczaj mniejsze i szybciej kodu.
Praca z CAsyncSocket, konwersji wszelkich niezbędnych kolejność bajtów musi zarządzać samodzielnie.Windows Sockets modelu kolejność bajtów "big-Endian" i jest prostsze udostępnia funkcje konwersji między to zamówienie i inne.CArchive, jednak, które należy z CSocket, używa kolejności odwrotnej ("little-Endian"), ale CArchive zajmuje się szczegóły konwersji kolejność bajtów dla Ciebie.Za pomocą tego standardowych sortowania w aplikacji lub przy użyciu funkcji konwersji kolejność bajtów Windows Sockets, można zwiększyć kodu bardziej przenośne.
Jest idealnym przypadku za pomocą gniazd MFC, podczas pisania oba końce komunikatu: za pomocą MFC na obu końcach.Podczas pisania aplikacji, która będzie komunikować się z aplikacji innych niż MFC, takich jak serwer FTP, prawdopodobnie będzie trzeba zarządzać bajt zamiana samodzielnie przed przekazywania danych do obiektu archiwum przy użyciu procedury konwersji Windows Sockets ntohs, ntohl, htons, i htonl.Przykładem tych funkcji, używane w komunikacji z aplikacji MFC nie pojawia się w dalszej części tego artykułu.
[!UWAGA]
Gdy koniec komunikatu jest aplikacja MFC, również trzeba unikać streaming obiekty C++ pochodzące z CObject do archiwum, ponieważ odbiorca nie będzie mógł je obsłużyć.Patrz Uwaga w Windows Sockets: za pomocą gniazd z archiwami.
Aby uzyskać więcej informacji o zamówieniach bajt, zobacz specyfikację Windows Sockets, dostępne w Windows SDK.
Przykład konwersji kolejność bajtów
W poniższym przykładzie pokazano funkcję serializacji dla CSocket obiekt, który korzysta z archiwum.Ilustruje również, za pomocą funkcji konwersji kolejność bajtów w interfejsie API programu Windows Sockets.
Ten przykład przedstawia scenariusz, w którym zapisuje się klient, który komunikuje się z innych niż MFC aplikacji serwera, dla którego nie masz dostępu do kodu źródłowego.W tym scenariuszu należy zakładać, używane przez serwer do MFC standardowych sieciowa kolejność bajtów.Natomiast korzysta z aplikacji klienckiej MFC CArchive obiekt z CSocket obiektu, i CArchive używa kolejności bajtów "little-Endian", przeciwieństwo standard sieci.
Załóżmy, że serwer MFC nie, z której planuje się komunikować ma protokół pakietu następującego komunikatu:
struct Message
{
long MagicNumber;
unsigned short Command;
short Param1;
long Param2;
};
W kategoriach MFC to będzie wyrażana w następujący sposób:
struct Message
{
long m_lMagicNumber;
short m_nCommand;
short m_nParam1;
long m_lParam2;
void Serialize( CArchive& ar );
};
W języku C++ struct jest zasadniczo odpowiednikiem klasa.Message Struktura może mieć funkcji elementów członkowskich, takich jak Serialize Członkowskich funkcja zadeklarowana powyżej.Serialize Funkcji składowej może wyglądać następująco:
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);
}
}
W tym przykładzie wywołuje dla konwersji kolejność bajtów danych, ponieważ istnieje wyraźne niezgodność między kolejność bajtów MFC nie aplikacji serwera na jednym końcu i CArchive używane w aplikacji klienckiej MFC po drugiej stronie.W przykładzie zilustrowano niektóre funkcje konwersji kolejność bajtów, które dostarcza usługi Windows Sockets.W poniższej tabeli opisano te funkcje.
Funkcje konwersji systemu Windows Sockets kolejność bajtów
Funkcja |
Cel |
---|---|
ntohs |
Przeliczenie ilości 16-bitowe z sieciowa kolejność bajtów do hosta kolejność bajtów (big-Endian na little-Endian). |
ntohl |
Przeliczenie ilości 32-bitowe z sieciowa kolejność bajtów do hosta kolejność bajtów (big-Endian na little-Endian). |
Htons |
Przeliczenie ilości 16-bitowe z hosta kolejność bajtów do sieciowa kolejność bajtów (little-Endian do big-Endian). |
Htonl |
Przeliczenie ilości 32-bitowe z kolejność bajtów hosta do sieciowa kolejność bajtów (little-Endian do big-Endian). |
Inny punkt ten przykład jest aplikacji gniazda na koniec komunikatu po aplikacji MFC nie musi uniknięcie czymś tak jak poniżej:
ar << pMsg;
gdy pMsg jest wskaźnik do obiektu C++ pochodną klasy CObject.Będzie to wysyłanie dodatkowych informacji MFC skojarzone z obiektami i serwer nie będzie zrozumieć, jak gdyby był on aplikacji MFC.
Aby uzyskać więcej informacji zobacz: