다음을 통해 공유


Windows 소켓: 바이트 순서

이 문서 및 두 개의 부록 Windows 소켓 프로그래밍에는 몇 가지 문제에 설명합니다.이 문서에서는 바이트 순서를 다룹니다.다른 문제는 문서에서 설명: Windows 소켓: 차단Windows 소켓: 문자열 변환.

사용 하거나 클래스에서 파생 되는 경우 CAsyncSocket, 이러한 문제를 직접 관리 해야 합니다.사용 하거나 클래스에서 파생 되는 경우 CSocket, MFC 관리를 자동으로.

바이트 순서

서로 다른 컴퓨터 아키텍처는 종종 서로 다른 바이트 순서를 사용 하 여 데이터를 저장 합니다.예를 들어, Intel 기반 컴퓨터 Macintosh (Motorola) 컴퓨터의 역순으로 데이터를 저장 합니다."리틀-엔디안," 라는 인텔 바이트 순서를 역순으로 네트워크 표준 "Big-endian" 순서 이기도 합니다.다음 표에서 이러한 용어를 설명합니다.

고 거의 Big-endian 바이트 순서

바이트 순서

의미

빅 엔디안

가장 중요 한 바이트 단어의 왼쪽된 끝에 있습니다.

리틀 엔디안

가장 중요 한 바이트 단어의 오른쪽 끝에 있습니다.

일반적으로 보내고 받은 네트워크를 통해 데이터에 대 한 바이트 순서 변환을 염려할 필요가 없습니다 하지만 바이트 순서를 변환 해야 하는 경우가 있습니다.

바이트 순서를 변환 해야 때

다음과 같은 상황에서 바이트 순서를 변환 해야 합니다.

  • 네트워크에서 다른 컴퓨터로 전송 되는 데이터와 대조적으로 해석할 수 있어야 하는 정보를 전달 합니다.전달 될 수 있습니다 예를 들어, 포트와 네트워크를 이해 해야 하는 주소입니다.

  • 사용자가 통신 하는 서버 응용 프로그램이 MFC 응용 프로그램이 아닌와 소스 코드를 갖고 있지.두 컴퓨터가 같은 바이트 순서를 공유 하지 않는 경우이 대 한 바이트 순서 변환 호출 합니다.

바이트 순서를 변환할 필요가 없을 때

다음과 같은 상황에서 바이트 순서를 변환 하는 작업을 방지할 수 있습니다.

  • 양쪽의 컴퓨터가 바이트 바꾸기에 동의 하지 수 및 두 컴퓨터가 모두 같은 바이트 순서를 사용 합니다.

  • 서버와 통신 하는 MFC 응용 프로그램입니다.

  • 또는 바이트 순서를 변환 해야 하는지 여부를 명시적으로 지시할 수 있습니다 사용자가 통신 하는 서버에 대 한 소스 코드를 수 있습니다.

  • 서버에 MFC 이식할 수 있습니다.이 작업을 수행 하려면 상당히 쉬운 이며 결과 일반적으로 코드가 줄어들고 더 빨라집니다.

작업 CAsyncSocket, 모든 필요한 바이트 순서 변환을 직접 관리 해야 합니다.Windows 소켓 "Big-endian" 바이트 순서 모델 표준화 및이 순서와 다른 사람 사이 변환 하는 함수도 제공 합니다.그러나 CArchive,를 사용 하는 CSocket, 반대 ("Little-endian") 순서를 사용 하 여 있지만 CArchive 바이트 순서 변환에 대 한 세부 정보를 처리.이 응용 프로그램에서 표준 순서 또는 Windows 소켓 바이트 순서 변환 함수를 사용 하 여 사용 하 여 코드를 이식 수 있습니다.

통신의 양쪽 끝을 작성 하는 경우 MFC 소켓을 사용 하 여 이상적인 경우: MFC를 사용 하 여 양쪽 끝에 있습니다.비 MFC 응용 프로그램에서 FTP 서버와 같은 아마 해야 바이트-직접 데이터는 보관 개체를 전달 하기 전에 교체 관리 통신할 신청서를 작성 하는 경우 Windows 소켓 변환 루틴을 사용 하 여 ntohs, ntohl, htons, 및 htonl.예로 비 MFC 응용 프로그램과 통신을 하는 데 이러한 함수에 대 한 내용은이 문서의 뒷부분에 나오는 나타납니다.

[!참고]

통신의 상대방 MFC 응용 프로그램이 없는 경우에 스트리밍 C++ 개체에서 파생 피해 야 CObject 에서 보관에 수신자가 처리할 수 있기 때문에.참고를 참조 하십시오 Windows 소켓: 보관 파일을 사용 하 여 소켓.

바이트 순서에 대 한 자세한 내용은 Windows 소켓 사양을 사용할 수 있는 Windows SDK.

한 바이트 순서 변환 예제

다음 예제에 serialization 함수는 CSocket 아카이브를 사용 하는 개체입니다.Windows 소켓 API의 바이트 순서 변환 함수를 사용 하 여 보여 줍니다.

이 예제에서는 MFC 형식이 아닌 서버 응용 프로그램의 소스 코드에 액세스할 있는 통신 하는 클라이언트를 작성 하는 시나리오를 제공 합니다.이 시나리오에서 MFC 형식이 아닌 서버 표준 네트워크 바이트 순서를 사용 한다고 가정해 야 합니다.반대로 MFC 클라이언트 응용 프로그램에서는 CArchive 개체에 CSocket 개체 및 CArchive "Little-endian" 바이트 순서를 반대로 표준 네트워크를 사용 하 여.

통신 하려는 MFC 형식이 아닌 서버에는 다음과 같은 메시지 패킷 위한 확립 된 프로토콜 했다고 가정 합니다.

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

MFC 용어를이 다음과 같이 표현할 수 있습니다.

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

    void Serialize( CArchive& ar );
};

C + +에서는 struct 는 클래스와 동일한 작업입니다.Message 수 있는 구조가 멤버 함수 등의 Serialize 멤버 함수 선언 위에.Serialize 멤버 함수 처럼 보일 수 있습니다.

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

한쪽 끝에서 MFC 형식이 아닌 서버 응용 프로그램의 바이트 순서 사이의 분명 한 불일치가 있기 때문에 대 한 데이터의 바이트 순서 변환이 예제를 호출 하는 CArchive 다른 쪽 MFC 클라이언트 응용 프로그램에서 사용 합니다.이 예제에서는 몇 가지 제공 Windows 소켓 바이트 순서 변환 함수를 보여 줍니다.다음 표에서 이러한 함수를 설명합니다.

Windows 소켓 바이트 순서 변환 함수

Function

목적

ntohs

16 비트 수량을 네트워크 바이트 순서에서 호스트 바이트 순서로 (Big-endian Little-endian으로) 변환 합니다.

ntohl

32 비트로 네트워크 바이트 순서에서 호스트 바이트 순서로 (Big-endian Little-endian으로) 변환 합니다.

Htons

16 비트 수량을 호스트 바이트 순서에서 네트워크 바이트 순서로 (Little-endian Big-endian으로) 변환 합니다.

Htonl

호스트 바이트 순서에서 네트워크 바이트 순서로 (Little-endian Big-endian으로) 32 비트로 변환 합니다.

또이 이때의 비 MFC 응용 프로그램은 다른 쪽의 통신 소켓 응용 프로그램 되 면 다음과 같은 뭔가 피해 야 한다는 것:

ar << pMsg;

위치 pMsg 클래스에서 파생 되는 C++ 개체에 대 한 포인터는 CObject.MFC 응용 프로그램 경우 처럼 개체 및 서버와 관련 된 추가 MFC 정보를 이해 하지 보냅니다.

자세한 내용은 다음을 참조하십시오.

참고 항목

개념

Mfc에서 Windows 소켓