최근, 안드로이드 소켓 프로그래밍을 하면서,
이전에 만들어놓은 MFC 기반 서버와 통신을 하는 테스트 앱을 만들게 되었다.
여기서 발생한 문제가, 안드로이드에서 보낸 패킷이 서버에서 쓰레기값같이 이상하게 나온다는 것 !!!
이리저리 찾아보니 endian 문제였다. endian 이란 무엇인가 ?!?!
(그림 발췌 : Siren 님 Blog)
위 그림을 보면 제일 이해가 될듯 하다.
위의 0A 0B 0C 0D 라는 데이터 값을 저장 할 때, (10진수로는 168496141 )
Little-endian 은 메모리 첫 주소에 맨 뒤의 데이터부터 저장한다.
이와 반대로 Big-endian 은 맨 앞의 데이터부터 저장한다.
이 차이점은 생각보다 크다.
내 경험대로, Big-endian 을 사용하는 시스템에서 데이터를 그대로 보내고, Little-endian을 사용하는 시스템에서 송신하여
byte order의 변환 없이 그대로 사용하게 된다면,
0D 0C 0B 0A 로 값을 처리하게 된다. (10진수 2188893066)
이렇게 값이 완전 틀려져버리게 되므로, 사용되는 시스템의 차이에 따라 서로 맞추어서 한쪽에서 변환해야 할 필요성이 생긴다.
다시 정리를 해보자면,
Big-endian : High Order Byte
Little-endian : Low Order Byte
를 말하는 것이며,
Intel 기반 Processor 는 Little-endian 을, Power PC (Wii, PS3, Sun, 모토로라 등..)은 Big-endian을 사용한다.
곁귀로 듣기엔, 네트워크 상에서는 결국 Big-endian 으로 패킷이 전송되는데, 하위단에서 CPU 아키텍쳐 때문에 Little-endian 으로 변환된다는 말도 있다. (아직 사실여부는 조사가 필요...)
※ 문제는, Structure 로 맞추어져 있는 데이터의 집합으로 패킷으로 통신을 할 경우,
이놈들을 일일히 내부 데이터들의 byte order를 바꿔줘야 하는듯 하다.
(미치겠다... 귀찮...)
'Develope > MFC' 카테고리의 다른 글
IOCP 와 OpenSSL 사용 (공부중) (0) | 2016.07.28 |
---|---|
Memory Allocation 크기의 비밀 (1) | 2013.06.24 |
Warning C4150: 불완전한 형식 'XX::XX' 에 대한 포인터를 삭제했습니다. 소멸자가 호출되지 않습니다. (0) | 2013.06.11 |
[CTreeCtrl] 트리 컨트롤 Drag & Drop (0) | 2013.03.18 |
Overlapped IO 와 IOCP 이야기 (4) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (3-2) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (3-1) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (2) (0) | 2013.03.13 |
Overlapped IO 와 IOCP 이야기 (1) (1) | 2013.03.13 |
Visual Leak Detector (Memory Leak 찾기) (0) | 2013.02.14 |