면책 사항 : 나는 여기 모든 유사한 주제를주의 깊게 읽고 Google 검색을 수행했습니다. 질문에 대한 답변이없는 사람들이 있으므로이 주제에 정보를 축적하고 싶습니다. 오후 8시 30 분 P.S. 나는 영어로 그다지 좋지 않을지도 모른다. 그것에 관해 유감스럽게 생각해 라.자동 포트 포워딩 (UPnP?) C++
나는 P2P 응용 프로그램 (게임)을 만들고 싶습니다. 분명히 많은 사람들이 하나의 인터넷 액세스 포인트 (라우터)가있는 로컬 네트워크의 일부인 컴퓨터에서이 프로그램을 실행하게되며 응용 프로그램은 포트 포워딩 없이는 작동하지 않습니다. 그래서 연구를 통해 UPnP로 자동 포트 포워딩을 수행 할 수 있음을 알게되었습니다.
bool CPortController::Init() {
HRESULT result = CoInitialize(NULL); // Must be NULL
if (FAILED(result)) return false;
result = CoCreateInstance(__uuidof(UPnPNAT), NULL, CLSCTX_ALL, __uuidof(IUPnPNAT), (void **)&Nat);
if (FAILED(result) || !Nat) return false;
result = Nat->get_StaticPortMappingCollection(&Collection);
if (FAILED(result) || !Collection) return false; // Here I'm getting S_OK as result, but Collection is always == 0
return true;
}
그 이유 (코드에서 주석 참조) 내가 찾은 일어나고 검색 함 : (아니, 내가 업데이트 Win7에 있습니다) 1. 기존 시스템 마이크로 테스트 코드는 포트 포워딩에 액세스하기 위해 작성되었습니다 2. 라우터에 UPnP 기능이 없거나 활성화되지 않았을 수 있습니다. 3. 방화벽이 UPnP에 필요한 TCP 포트 2869 또는 UDP 포트 1900을 차단할 수 있습니다.
슬프게도 라우터에 대한 액세스 권한이 없습니다 마지막 2 개이지만 Skype와 uTorrent (둘 다 p2p)가 완벽하게 작동하므로 그다지 중요하지 않습니다. 사용자에게 아무 것도하지 말고 내 트릭과 포팅을 자동으로 수행하는 방법을 찾아야합니다.
UPnP를 라이브러리 정보 : 나는 몇 UPnP를 라이브러리 (PlatinumUPnP, miniUPnP를) 발견했습니다 ,하지만 그들은 너무 많은 코드가 스마트 기기를 발견하고 함께 퍼팅의 방향 갖고있는 것 같아요 ... 음 ... 내가 ' 위의 작업을 완료하기 위해이 작업이 필요한지 확실하지 않으며 자동 포트 포워딩을 위해 위에 나열된 WinUPnPAPI를 사용하지 않는 코드 조각을 찾을 수 없습니다.
저는 조금 잃었습니다. 누구든지 연구를 계속할 방향을 제시 할 수 있습니까? 어쩌면 거기에 UPnP 이외의 다른 것이 있습니까? 어쩌면 사용할 lib (내가 놓친)가 있을까요? 빛을 퍼뜨려주세요. 미리 감사드립니다.
Skype는 공개 서버의 협조가 필요한 [NAT hole punching] (http://en.wikipedia.org/wiki/UDP_hole_punching)이라는 트릭을 사용하여 UPnP의 필요성을 피합니다. 이것은 이후의 통신이 있지만 초기 연결 설정 단계가 P2P가 아님을 의미합니다. – Rook
@Rook, HolePunching에 대해 알려 주셔서 감사합니다. 나는 몇 가지 기사를 읽었으며 정확히 필요한 것 같습니다. 슬프게도, 코멘트로 게시 되었기 때문에 귀하의 코멘트를 "승인 된 답변"으로 표시 할 수는 없지만, 그만한 가치가 있습니다! 감사합니다 :) – JacksonRR
음, uPnP에 대해 전혀 말하지 않기 때문에 대답을하지 않을 것입니다. Pavel의 답은 그 점에서 오히려 더 유용합니다! – Rook