Unix Server와 PC와 UDP Socket을 써서 통신을 하려고 합니다.
근데 Unix Server에서 Port를 입력할때 htons(port)를 써서 PC로
Connect하면 Delphi4.0의 UDP socket이 잘 동작 하고,
Unix Server에서 Port를 입력할때 그냥 port를 써서 PC로 Connect
하면 Delphi4.0에서는 OnDataReceive조차 뜨질 않습니다.
그래서 Unix Server에선 항상 htons(port)를 해 줘야 했는데 이것을
그냥 Unix Server에서 port를 대입했을때도 UDP가 되게 할수는 없나요?
> Unix Server와 PC와 UDP Socket을 써서 통신을 하려고 합니다.
> 근데 Unix Server에서 Port를 입력할때 htons(port)를 써서 PC로
> Connect하면 Delphi4.0의 UDP socket이 잘 동작 하고,
> Unix Server에서 Port를 입력할때 그냥 port를 써서 PC로 Connect
> 하면 Delphi4.0에서는 OnDataReceive조차 뜨질 않습니다.
>
> 그래서 Unix Server에선 항상 htons(port)를 해 줘야 했는데 이것을
> 그냥 Unix Server에서 port를 대입했을때도 UDP가 되게 할수는 없나요?
안녕하세요 김영대입니다
질문하신 내용이 port 를 지정할때 htons(port) 를 사용하지 않고
UDP 통신을 할 수 있는가의 문제인가요 ?
만약 그렇다면 htons 를 사용하지 않고도 가능합니다
하지만 한가지 순서를 지켜주셔야 합니다
<네트워크 바이트 순서>
예를들어 2 byte 정수 1234 가 있다고 하면 실제 시스템 마다
1234 라는 정수를 저장하는 순서가 틀립니다
메모리에 저장할때 1234 그대로 저장하는 시스템이 있는가 하면
3412 로 저장하는 시스템이 있습니다
그래서 2 byte 중 하위 byte 가 낮은 주소인 경우를 Little Endian 이라 하고,
상위 byte 가 낮은 경우를 Big Endian 이라 합니다
현재 Big Endian 방식은 IBM 370, 모토롤라 68000, 파라미드 등의 시스템에서
사용하고 있고, Little Endian 방식은 Intel 80X86(IBM PC), DEC VAX, DEC PDP-11
등에서 사용하고 있습니다
여기까지 읽어보시면 요점을 파악하셨을텐데...
이렇게 1234 로 쓰는 시스템과 3412 로 쓰는 시스템이 통신을 하게되면
아주 이상한 결과가 나타나겠죠...(보내기는 1234인데 받고보니 3412 ???)
시스템이야 어떻 방식을 사용하든 한가지 방식으로 통일하여 통신하는데
그것이 Network Byte 순서입니다
그래서 어떤 시스템이건 통신을 하기전에 2 Byte, 4 Byte 값들은(1 Byte는 의미없음)
시스템 숫자표현 방식을 Network Byte 순서로 바꾸어서 전송하고 받는 곳에서는
이 Network Byte 순서를 자기의 숫자표현 방식으로 바꾸어서 사용하게 됩니다
지원되는 함수로는
htonl() -> long형 4 Byte 정수를 시스템 형식에서 Network Byte 순서로
htons() -> short형 2 Byte 정수를 시스템 형식에서 Network Byte 순서로
ntohl() -> long형 4 Byte 정수를 Network Byte 순서에서 시스템 형식으로
ntohs() -> short형 2 Byte 정수를 Network Byte 순서에서 시스템 형식으로
제가 질문을 제대로 이해하고 썼는지 모르겠습니다