c, c++ 구조체 패킹
네트워크 소켓통신시에는 패킹이라는 것을 해야합니다.
우선, 왜써야 할까?
해당 구조체에서 Data 구조체의 크기는? data[0]는 단순히 메모리 위치만은 가르키는 녀석이기 때문에 4+ 1+ 1+ 1 = 7 이어야 하지만, 8이 나오는 모습을 볼 수 있었다.
그 이유는
바이트 패딩:
몇몇 컴파일러는 구조체의 필드를 메모리에 위치시킬때 중간에 빈공간없이 쭉 이어서 할당하는 경우도 있지만 대부분의 컴파일러는 성능향상을 위해 CPU가 접근하기 쉬운 위치에 필드를 배치하는데(OS나 컴파일러에 따라 4바이트단위 또는 8바이트 단위로 끊는작업을 함) 이를 "바이트 패딩"이라고 하며, 그러다보니 중간이 빈 공간이 들어가게 되는데 이 빈 공간을 "패딩비트"라 한다.
이녀석 때문이다.
패딩 비트를 제거해주고, 연속된 메모리에 데이터를 할당하고 소켓통신을 해야만 올바르게 데이터를 주고 받을 수 있다.
그렇기 때문에 소켓통신시에 패킹이 필요한 것이다.
사용방법은 간단!!
이런식으로 데이터를 묶어주면 된다.
헤더는 #include <stdio.h>
pack(push, 1) // 1바이트 크기로 정렬하겠다는 의미
pack(pop) // 정렬 설정을 이전 상태(기본값)로 되돌리겠다는 의미
해당방법은
- Visual Studio, GCC 4.0 이상
의 환경에서만 가능하다.
이전버전을 사용한다면( 그럴 일은 거의 없지만..) 혹은 다른 방법을 원한다면 아래 링크들을 참고
dojang.io/mod/page/view.php?id=432
C 언어 코딩 도장: 51.2 구조체 정렬 크기 조절하기
데이터 전송이나 저장을 할 때 구조체 정렬을 피하려면 어떻게 해야 할까요? 그런데 C 언어에서는 구조체를 정렬하는 표준 방법이 없습니다. 하지만 걱정하지 않아도 됩니다. 각 컴파일러에서
dojang.io
www.vbflash.net/164
https://3dmpengines.tistory.com/1571 [3DMP]
C/C++ 및 C# Scoket 통신
Introduction 본 블로그의 포스팅과 관련된 내용을 작성한지 몇년이 지났는데, 에버노트를 정리하다가 버릴까 하던 내용을 다시 다시 주워서 정리 후 포스팅합니다. 최근에는 C/C++을 이용한 개발
www.vbflash.net