네트워크 소켓통신시에는 패킹이라는 것을 해야합니다.
우선, 왜써야 할까?
해당 구조체에서 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
www.vbflash.net/164
https://3dmpengines.tistory.com/1571 [3DMP]
'프로그래밍 언어 > C++' 카테고리의 다른 글
fnctl함수 (c, c++), 논블록킹 구현하기 (0) | 2021.03.17 |
---|---|
가변길이 구조체(flexible array member)란? (0) | 2021.03.10 |
c++ 우선순위 큐 priority_queue 사용법 (0) | 2020.07.29 |
C++ sort함수 invalid comparator 오류 (0) | 2020.05.04 |
C++ memset 사용법 (0) | 2020.05.03 |