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. , r. ); // ➌ s.close(); }
7 같은 포트를 여러 소켓이 공용할 수 있게 하는 옵션을 별도로 켜지 않는 한 말입니다.
8 실제로는 이렇게 하면 안 되고, close()를 하기 전에 송신하려는 데이터가 송신 버퍼에서 빠져나가야 합니다. 지금은 이 내용을 다루지 않겠습니다.