더북(TheBook)

UDP 소켓을 생성한다고 해서 바로 통신할 수 있는 것은 아닙니다. 데이터를 주고받으려면 포트를 하나 할당해야 하는데, 할당하는 함수로 bind()를 호출하면 됩니다(). bind() 인자로는 포트 값을 넣습니다. any_port, 즉 0을 넣으면 운영체제가 알아서 사용 가능한 포트를 할당합니다. 이미 다른 곳에서 사용 중인 포트를 할당하려고 하면 실패합니다.7

이제 준비를 마쳤습니다. sendTo()를 호출해서 상대방의 주소와 포트, 즉 끝점에 원하는 데이터를 보내면 됩니다(). 여기서는 주소가 55.66.77.88인 단말기의 포트 5959번에 “hello”라는 데이터를 보냈습니다. UDP는 기본적으로 바이너리로 데이터그램을 취급하므로 이 예시에서는 ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, 0x00을 전송할 것입니다.

close()를 호출하면 소켓 핸들이 닫힙니다(). 소켓 핸들이 닫히면 할당받은 포트도 다른 곳에서 사용 가능한 상태가 됩니다.8

이번에는 데이터를 수신하는 쪽 코드를 살펴봅시다.

코드 단말기 B 55.66.77.88에서 수신

main()
{
    s = socket(UDP);
    s.bind(5959);                  // ➊
    r = s.recvfrom();              // ➋
    print(r.srcAddrPort, r.data);  // ➌
    s.close();
}

 

7 같은 포트를 여러 소켓이 공용할 수 있게 하는 옵션을 별도로 켜지 않는 한 말입니다.

 

8 실제로는 이렇게 하면 안 되고, close()를 하기 전에 송신하려는 데이터가 송신 버퍼에서 빠져나가야 합니다. 지금은 이 내용을 다루지 않겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.