더북(TheBook)

소켓 핸들을 만들고 UDP 포트를 할당하는 과정까지는 송신 측과 비슷합니다. 다만 이때는 bind()를 호출할 때 포트 번호를 명시적으로 지정했습니다. 송신 측에서 의도적으로 포트 5959번으로 데이터를 보냈기 때문입니다(). 그러면 0(any_port)을 넣으면 안 되냐고요? 됩니다. 다만 이때 운영체제가 알아서 할당한 포트 값을 송신 측에서는 어떤 방법을 써서라도 알아내야 합니다.

recvfrom()을 호출하면 데이터를 받습니다. 데이터가 아직 도착하지 않았으면 함수는 리턴하지 않습니다. 다시 말해서 블로킹 상태가 됩니다. 데이터가 도착하면 비로소 함수는 리턴하고 받은 데이터와 데이터를 보냈던 송신자 주소가 변수 r에 채워집니다. r.data는 바이너리 데이터겠죠. 하지만 보낸 쪽에서 ‘h’, ‘e’, ‘l’, ‘l’, ‘o’, 0x00을 보냈으므로 사실상 문자열 형태입니다. 출력하면 깔끔하게 결과가 나올 것입니다().

11.22.33.44:53234 hello

여기서 53234는 송신자 측에서 bind(0)을 호출했을 때 거기서 임의로 할당된 포트 번호입니다.

UDP 소켓을 이용해서 데이터를 보내는 것뿐만 아니라 받는 것도 가능합니다. 수신용 소켓, 송신용 소켓을 따로 만들지 않아도 됩니다. 보통은 수신용 소켓과 송신용 소켓을 따로 만드는 것 자체를 권장하지 않습니다.

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