본문 바로가기

TechLog

WP 7.1의 UDP 소켓 프로그래밍 Workaround

※ 이 글에 내용을 추가하려니 글 내용이 난잡해질 것 같아 새로 포스팅했습니다:
   Windows Phone에서의 UDP 소켓 프로그래밍에 대해 살펴보고 싶은 분은 Windows Phone 7.1에서의 UDP 패킷 송/수신 트릭을 읽어주세요.

 

큰 맥락은 다음의 문서를 참고하도록 하자 (StackOverflow 링크):

 

기본적으로 Windows Phone OS 7.1에서는 소켓 바인딩을 지원하지 않는다. ‘그게 뭐?’라고 생각할 열분도 계실 것 같긴 하지만, 그러니까 기본적으로 … 윈도우 폰에서는 소켓 서버를 구현할 수 없다는 이야기이다. 아니 이게 무슨 소리요 윈폰이 곶아라니

TCP 환경에서는 이게 얼추 말이 되는 소리이기는 하다. 보통 스마트폰에서 TCP 소켓을 사용해서 프로그래밍을 할 때에는 대부분 클라이언트 입장에서 서버에 접속하여 데이터를 주고 받거나 하는 경우가 많고, 스마트폰끼리 서버가 되어 서비스를 제공한다던가 하는 일은 그리 흔하지 않은 편이다. (없다는 것은 아니다. 다른 스마트폰을 쓰다 보면 파일 공유를 위해 스마트폰 위에서 조그만 웹 서버를 돌린다던가 하는 일도 있으니까) 어쨌든, 윈도우 폰이 클라이언트 역할만을 맡는다는 가정 하에서 TCP 소켓 프로그래밍을 한다면 크게 문제는 없다.

UDP 소켓 프로그래밍을 할 때에는 이게 좀 웃긴 상황이 되는데 … UDP는 아시다시피 무연결(Connectionless) 지향 프로토콜이다. UDP 소켓은 단순히 패킷을 전송/수신하는 것 외에 할 수 있는 일이 없는 것이다. 근데 바인딩이 안 된다? 다시 말하면, 윈도우 폰에서는 UDP 패킷은 송신만 가능하고 수신은 불가능하다는 이야기이다.

아마 여기까지 읽고, UDP 소켓 프로그래밍을 한 번이라도 해 본 사람이라면 ‘뭐야 이게 ㅋㅋ 미친거 아냐?’라고 생각할지 모르겠지만 … 진짜 나도 이런 디자인을 한 게 대체 누군지 좀 만나봤으면 싶은 심정이다;

 

하지만 UDP 소켓에서 ReceiveFromAsync 메서드를 호출하는 것이 가능하기는 하다. (UDP 소켓의 경우 SendToAsync, ReceiveFromAsync 메서드를 사용하여 패킷을 송수신한다) 수신이 불가능하다면, 이 메서드는 대체 어디다가 쓰는걸까?

위의 StackOverflow 글을 참조하고 MS의 UDP 프로그래밍 예제를 살펴보면 그 내용을 알 수 있는데, 이게 또 내용이 압권이다:

패킷을 UDP 서버에 전송(=SendToAsync 메서드 호출)하고 나면, 그때부터는 ReceiveFromAsync 메서드를 사용해 패킷을 수신할 수 있다.

다시 말하자면, 특정 호스트에서 UDP 패킷을 수신하려면 일단 UDP 패킷을 그 호스트에 전송해야 한다는 이야기이다. UDP 패킷(1바이트짜리라도 상관없다!)을 특정 호스트에 전송하기 전에는 ReceiveFromAsync 메서드를 호출하면 예외가 발생하는데, UDP 패킷을 전송하고 나면 예외가 발생하지 않게 된다.

 

 

대체 뭐야 이 미친 설계는!!! orz

 

 

그리고 … 일단 UDP 브로드캐스팅 송신은 정상적으로 작동한다. UDP 클라이언트로써 패킷을 ‘송신’하는 기능에는 거의 제한이 없는 것 같다. 반대로, 브로드캐스트 패킷을 수신하는 기능은 동작하지 않는다. 위의 UDP 예제를 보면 분명 브로드캐스트 수신 주소인 Any IP 주소(0.0.0.0)를 사용하고 있지만, 이것도 위에서 설명한대로 ‘이미 UDP 패킷을 전송한 호스트에서 송신한 유니캐스트 UDP 패킷만 수신한다’는 정책을 따르고 있는 것 같다. (이 부분은 아직 확인이 되지 않았다. 내일 확인할 예정)

MS에서는 ‘여러 윈폰 디바이스에게 UDP 패킷을 전달하는 상황’을 게임이나 동영상 스트리밍 같은 특별한 상황에만 국한시키려는 것 같은 인상이 든다. 멀티캐스트용 통신 클래스가 별도로 존재하고, TCP/UDP에 이런저런 제약을 걸어 이상하게 만들어 놓은 것도 그런 이유 때문이 아닐까 싶긴 한데 … UDP 브로드캐스팅을 쓸 일이 그렇게 많지는 않은 것이 사실이긴 하지만, 딱히 이걸 허용한다고 해서 보안상의 위협이 증가한다거나 성능에 악영향을 미친다거나 할 수 있을 것 같진 않은데, 그저 의아할 따름이다.