소켓이나 파일을 통해 읽어들인 데이터를 구조체에 한꺼번에 넣
글쓴이: kornet / 작성시간: 수, 2003/02/19 - 3:54오후
안녕하세요.
소켓이나 파일을 통해 데이터를 읽어들였는데, 그 데이터를 읽어들이는 과정이 비동기적으로 이루어지는지라 하나씩 처리하기 귀찮아서(^^;) 한꺼번에 읽어들였습니다.
이때 char* buf 에 모든 데이터가 들어가있고, 그 앞부분에 다음과 같은 구조체로 되어있습니다.
<code>
struct packetType {
unsigned int nTotalLength;
unsigned int nHeaderLength;
unsigned char nProtocolVersion;
char pcGameCode[3];
unsigned char nGameVersion;
unsigned int nCommand;
};
</code>
이것을 그냥 구조체로 캐스팅하면 바이트 정렬 문제로 인하여 데이터가 상하죠. ㅡㅡ;
1바이트씩 읽어서 빅엔디안/리틀엔디안 시스템에 따라 비트쉬프트를 하여 2/4바이트의 값으로 조합하는 것도 생각해봤지만,
무언가 더 좋은 방법이 있을 것 같은데.. 어떻게 하면 깔끔하게 처리될까요?
고수님들의 조언을 부탁드립니다 ^^
Forums:
ntohl을 사용해보심이...함수를 만들어놓고 변환하시는 게 어떨까하
ntohl을 사용해보심이...
함수를 만들어놓고 변환하시는 게 어떨까하는데요...
읽는 것은 네트웍 오더일 것이고 사용하기는 호스트 바이트오더니까요.
저장할 때는 htonl로 하시고요.
rommance.net
제가 실수를 했네요. ^^; 바이트 오더가 아니라 구조체 멤버 정
제가 실수를 했네요. ^^;
바이트 오더가 아니라 구조체 멤버 정렬 문제였어요.
구조체 패딩 문제없이 어떻게 하면 저것을 깔끔하게 메모리상의 구조체로 옮길 수 있을까요?
만약 C++ 이라면 다음과 같이 해결할 수 있겠지요...C 라면..
만약 C++ 이라면 다음과 같이 해결할 수 있겠지요...
C 라면.. 뭐.. 별수 없슴다..
unsigned long 이라고 가정하고 하겠습니다..
연산자 overloading 을 사용하면 메모리상에서는 network byteorder로
표현할때는 host 의 byte order로 변환되어 처리되니까
읽는 쪽도 아무 문제 없이 바로 읽을 수 있습니다.
도움이 됐을까요?
---
http://coolengineer.com
댓글 달기