UDP 소켓으로 데이터를 받으려면 별다른 절차 없이 recvfrom() 함수를 호출한다.
int recvfrom(SOCKET sock, char* buf, int len, int flags, sockaddr* from, int* fromlen);
sock은 데이터를 받으려는 소켓이다. 별다른 옵션을 설정하지 않은 경우, 소켓에 아직 수신된 데이터그램이 없으면 스레드가 블로킹되어 데이터그램을 수신할 때까지 기다린다.
buf는 수신한 데이터그램을 복사해 넣을 버퍼를 가리킨다. 별도 플래그를 설정하지 않는 한, 데이터그램이 recvfrom() 호출을 통해 버퍼에 복사되고 나면, 소켓 라이브러리는 그 사본을 따로 보관해 두지 않는다.
len에 buf 인자가 담을 수 있는 최대 바이트 길이를 지정한다. 버퍼 오버플로 에러를 방지하기 위해 recvfrom()은 여기에 지정된 숫자 이상의 바이트는 복사하지 않는다. 수신된 데이터그램 중 버퍼가 모자라 잘린 부분은 그냥 버려지므로, 예상되는 최대 길이로 버퍼 공간을 넉넉히 잡도록 하자.
flag는 데이터 수신을 제어하는 비트 플래그이다. 대부분 게임 코드에서 이 값은 0이면 충분하다. 가끔 쓸모 있는 플래그는 MSG_PEEK 플래그이다. 이 플래그를 지정하면 수신된 데이터그램을 buf에 복사한 다음 데이터그램을 입력 대기열에서 제거하지 않는다. 이렇게 하면 다음번 recvfrom() 호출에서 더 큰 버퍼를 할당해 같은 데이터그램을 다시 받아볼 수 있다.