반응형
// 네트워크 바이트 오더(빅엔디언)에서 호스트 바이트 오더(리틀엔디언)으로 변환
ntohl(network byte order to host byte order)

//호스트 바이트 오더(리틀 엔디언)에서 네트워크 바이트 오더(빅엔디언)으로 변환
htonl(host byte order network byte order)


흔히 host에서 network로 데이터를 보낼 때는 htonl()를 network에서 host로 데이터를 보낼 때는 ntohl()를 사용한다.


쉽게 예를 들자면, 클라이언트에서 서버로 데이터를 보낼 때는 htonl(), 서버에서 클라이언트로 데이터를 보낼 때는 ntohl()이지만

 

여기서 말하는 host는 server만을 특정하는 것이 아니다.


여기서 말하는 host는 자기 집이나 다른 사람 집에 있는 컴퓨터 안에 있는 CPU를 말하는 것이다.

(정확하게 말하면 local machine이지만, 확실히 와닿지 않는다면 집에 있는 컴퓨터 안에 있는 CPU 라고 이해를 해도 된다.)

CPU가 빅 엔디언 방식의 CPU일 때는 위의 두 함수 중 어떤 것을 쓰던 결국에는 아무런 동작이 없다.

(즉, 빅 엔디언 방식의 CPU 환경이라면 위의 함수를 아에 안 써도 된다.)

 

하지만 CPU가 리틀 엔디언 방식의 CPU일 때는 바이트 오더를 바꾼다.

 

주의할 점은 시스템에 따라서 ntohl() 함수와 htonl() 함수의 실행 결과가 동일할 수도 있다.

 

즉, ntohl()를 써도 동작하고 htonl()을 써도 동작하고 이름과 상관없이 두 함수는 같은 동작을 한다는 것이다.

 

그러면 왜 함수 이름을 구분해놨냐 라는 의문점이 들 수 있는데 그 질문에 대한 답은 그저 가독성과 이식성 때문이다.

 

빅엔디언 환경에서 개발한다 하더라도 htonl()이나 ntohl()을 쓰시면 나중에 리틀엔디언 환경에서 해당 프로그램을 실행했을 때도 정상적으로 동작이 되기 때문이다.

반응형

+ Recent posts