2009년 10월 1일 목요일

벨킨 공유기 UPnP AddPortMapping 문제

upnp 를 위해 덩치큰 라이브러리를 가져다 쓰지 않고 직접 짰는데 이게 테스트에 쓴 다른 공유기들(Intel UPnP SDK  기반) 에선 문제 없지만 벨킨 공유기에서는 문제가 생기더라.

결론만 적자면 내가 평소 http 프로토콜을 직접 짜야 할 경우 보통 1.0 기반으로 만드는 편인데 이번에도 역시 1.0 기반으로 리퀘스트를 했고 벨킨 공유기는 이걸 에러로 취급해준것.

SOAP 이 HTTP 1.1 위에서 돌아야만 했던가? 흠 지금껏 이런 문제는 본적이 없는데
나중에 이것좀 찾아보자.


어 참고로 지금 UPnP 로 포트매핑 하는거 대강 순서나 적어둘까
  1. 디스커버리
  2. 찾았으면 디스크립션 읽어오고
  3. 그중에서 컨트롤 URL 을 파싱해서
  4. 먼저 DeletePortMapping 으로 이전 포트포워딩 정보가 있으면 지워주고
  5. AddPortMapping 으로 포트매핑 추가
음. 몇몇 공유기는 AddPortMapping 을 반복해서 불러도, 즉 기존에 뚫린거 또 뚫어 달라고 해도 별말없이 뚫어주는놈도 있고 어떤놈은 이미 뚫었다고 에러주는 경우도 있다. 따라서 뚫기전에 뚫은것 지워달라는 패킷을 추가한것.

정석대로라면 먼저 뚫어보고 이미 뚫려있다고 응답해오면 상황판단을 해서 뚫은것 지우고 다시 뚫거나 등등의 처리를 해야 하겠지만 흠. 일단 걍 막무가내로 뚫어버렸다.


아..
문제가 생긴 공유기는 벨킨 F5D8236-4 v2 였다.
지금은 꺼놔서 펌웨어 버전은 못적겠군.







댓글 2개:

n2v2rda2 :

안녕하세요 현재 c로 upnp포트포워딩을 연구중인데요 궁금한점이 있어서 글을 남깁니다

현재 보고 있는 책이 intel -Upnp design 입니다(e-book)

챕터 19에 보면 컨트롤 포인트를 만드는 과정이 간략히 나오는데요 discovery 에서 UpnpSearchAsync 를 사용하더라구요

제가 알기론 udp 를 이용해야 하는걸로 아는데 운영자님 파이썬글을 보아도 udp 로 통신하시더라구요 udp 와 UpnpSearchAsync 로 값을 구하는것에 차이가 있을까요 ?

yoonkn :

@n2v2rda2 - 2010/11/29 13:44
아.. 제가 블로그를 거의 안쓰다 보니 확인이 늦었네요.



저는 인텔라이브러리를 쓰지 않고 직접 구현하는 식으로 접근했습니다.

포트포워딩까지만 필요했기에 문서는 대강 구경만 하고 포트포워딩기능을 가진 P2P 클라이언트와 공유기간의 패킷을 wireshark 로 훔쳐서 그걸 기반으로 작업을 했구요.

따라서 UpnpSearchAsync 에 대해서는 제가 알기 어렵네요.



제가 올렸던 글중에 디스커버리부터 포트포워딩까지 테스트를 해본 코드가 있는데 참고해보세요

http://yoonkn.textcube.com/54



common lisp 코드이긴 헌데.. 흐름파악에는 문제가 없을듯하네요.

저도 저 코드로 기능테스트를 한후에 C 로 재구현을 했었습니다.