흠..코드를 보다보니 의문이 생긴 건데요..
htons 이나 htonl 같은것이 인디안 문제를 해결해 준다고
들었는데요. 그러면 실제 데이타는 어떻게 전송되는건가요?
send나 recv함수에서 해주는것인지..아니면 다른곳에서 바뀌어지는 것인지..
궁금합니다. 답변 부탁드립니다.
hton 은 host-to-network의 약자입니다.
즉 host의 endian을 network용 endian으로 바꿉니다.
network endian은 제가 알기로 big endian으로 알고 있습니다.
그러므로 hton을 big endian인 컴퓨터에서 콜하면 값이 변하지 않고 그대로 리턴됩니다.
반대로 small endian인 컴퓨터에서는 small -> big의 endian변경이 일어난 값이 리턴됩니다.
사용은 network에 데이터를 보낼 때는 모든 자료를 hton으로 바꾸어서 싣고, 반대로 수신할 때는 ntoh로 바꾸어 얻습니다.
그래서 network에서는 network endian을 지켜서 쓸수 있도록 하고 각 host에서는 자신의 host에 맞는 endian을 쓸수 있도록 하는 것이죠.
hton 은 host-to-network의 약자입니다.즉 host의
hton 은 host-to-network의 약자입니다.
즉 host의 endian을 network용 endian으로 바꿉니다.
network endian은 제가 알기로 big endian으로 알고 있습니다.
그러므로 hton을 big endian인 컴퓨터에서 콜하면 값이 변하지 않고 그대로 리턴됩니다.
반대로 small endian인 컴퓨터에서는 small -> big의 endian변경이 일어난 값이 리턴됩니다.
사용은 network에 데이터를 보낼 때는 모든 자료를 hton으로 바꾸어서 싣고, 반대로 수신할 때는 ntoh로 바꾸어 얻습니다.
그래서 network에서는 network endian을 지켜서 쓸수 있도록 하고 각 host에서는 자신의 host에 맞는 endian을 쓸수 있도록 하는 것이죠.
켁..
아..그러면 port와 address를 그런식으로 저장하게 되면
실제 패킷을 날릴때도 인디안문제를 처리하는 건가요?
^^ 함께 커가는 세상
그건..
데이터를 어떤 방식으로 보내느냐에 따라 조금 달라지는데요.
send나 recv의 인자 중에 보내는 버퍼의 타입이 보이드라는거 아시져?
보통 sprintf같은 걸로 숫자도 문자열에 포함 시켜서 보내버리고 프로토 콜에 마춰 파싱한후 atoi같은걸 사용하는데...(제가 처음 네트웤 프로그램 작성 하던 당시... )
때에 따라서는 프로토콜을 구조체의 형태로 정의 하는게 좋을 때가 있습니다.
이렇게 보내면 recv(fd, &Data...) 해서 파싱이구 머구 한방에 해결될거라 생각하는데... 결과보구 놀라죠...
바이트 오더에 맛가는 일이 생기는 거죠..
주소구조체에 값체워 넣는일은 거의 정형화 된거라, 생각없이 포트 넣을때 바이트 오더 바꿔서 너주지만 위의 예처럼 데이터 보낼때는 무심코 바이트 오더 생각안하고..
하여간 그렇네요..
Do you think that's the air you are breathing now?
쉽게 생각하시면 될것 같습니다.TCP/IP 프로토콜 레이어에서 데
쉽게 생각하시면 될것 같습니다.
TCP/IP 프로토콜 레이어에서 데이터의 presentation에 대한 책임은
어플리케이션에 있습니다. 따라서, 네트워크를 경유하는 모든 데이터는
네트워크 바이트 오더에 맞추면되지요.
Socket라이브러리에서 사용하는 IP어드레스와 포트넘버 또한
각각 패킷과 세그먼트의 헤더에 복사되어 네트워크를 따라 이동하는
데이터이니, 마찬가지로 바이트오더링을 맞춰주어야지요.
댓글 달기