티스토리 뷰

카테고리 없음

Network Byte Ordering 정리

아몬드통 2023. 1. 30. 01:10

순서나 기타 여러가지는 자세하게 나와있는 블로그들 많으니까 내가 실수하고 겪은 부분만 포스팅

 

  • c++로 tcp/ip를 하다보면 시작부분에서 보통 Network Byte Ordering 을 배운다.
  • 처음에는 잘 이해가 안가더라도 몇번 읽다보면 이해되는 그런 개념이었다.
  • 다만 ip와 port는 htonl이나 htons 함수로 변환을 해줬는데 나머지 메세지나 그런 부분들은 변환해주는 부분이 없어서 의아했다.
  • 윤성우의 tcp/ip에는 ip와 port만 해주면 나머지는 자동으로 해준다고 되어있다.
  • 근데 아무리봐도 이해가 안가서 이것저것 찾아봤다.

결론

  • Network Byte Ordering 즉 "byte"의 순서를 바꾸는 것이므로 최소 2바이트 이상 되는 크기의 정수형(실수도 관련이 있긴하지만 여기서는 생략)만의 문제가 되므로 몇가지 해결책이 존재한다.
  • int, short는 htonl, htons를 통해서 변환해서 전송하기
  • int, short를 문자열로 변환해서 전송하기 123을 문자열로 변경하면 "123"이고 이건 결국 char[3]에 순서대로 123이 들어가므로 문제 없다.(물론 나중에 다시 캐스팅을 해야겠지만.)
  • 보통 우리가 사용하는 pc는 little일테니까 int를 예로 들면 낮은 주소에 높은 비트가 들어있는 4개의 바이트를 char[4]형에 변환해서 넣어준다. int{1,2,3,4} 이렇게 있다고 가정하고(숫자는 bit표현) char{4,3,2,1} 로 넣어주면 hton을 한것과 동일하므로(사실 이 방법은 결국 4byte씩 hton을 해주는 것과 다름이 없으므로 hton을 사용하면 된다.)

번외

  • 실수와 8byte인 long long 같은 경우는 내가 찾아봤을때는 따로 함수가 존재하지 않는다.
  • 그래서 스택오버플로 같은데서도 직접 변환하는 함수를 만들어서 사용하거나 아예 char[8]로 변환해서 보내는 방법을 사용하는 것 같다. 
댓글