반응형

네트워크 소켓통신시에는 패킹이라는 것을 해야합니다.

 

우선, 왜써야 할까?

 

 

해당 구조체에서 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

 

반응형

+ Recent posts