Q&A

  • UDP socket port변환 (htons)
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가 되게 할수는 없나요?

1  COMMENTS
  • Profile
    김영대 1999.07.05 23:50
    고광준 께서 말씀하시기를...

    > 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 순서에서 시스템 형식으로



    제가 질문을 제대로 이해하고 썼는지 모르겠습니다