2014-05-13 7 views
0

클라이언트 소켓 목록을 만들기 위해 추적기로 PHP 원격 서버가있는 Delphi XE5에서 P2P 응용 프로그램을 개발 중입니다. 나는 UDP 구멍 펀칭을 사용하면 클라이언트의 NAT가 PHP 원격 서버로 보낸 첫 번째 메시지에서 만든 임의의 포트를 닫거나 차단하도록 결정하는 경우 어느 시점에서 실패합니다.내 NAT에서 TCP/UDP 포트를 열어 P2P 응용 프로그램을 구성하려면 어떻게합니까?

그래서 저는 (Delphi로 작성된) 클라이언트에서 NAT를 사용하여 영구적 인 포트 구성을 만드는 방법을 알고 있습니다. 내 사용자가 라우터에 액세스하고 포트 전달을 구성하는 방법을 알아야하는 것은 원하지 않습니다.

PHP-P-H없이 소켓을 저장하기 위해 서버를 사용할 수 있습니까? 적어도 Delphi의 응용 프로그램이 실행되는 동안 포트는 열어 두어야합니까?

원격 서버에서 UDP 홀 펀치를 사용하기로 결정하면 다른 사용자가 직접 (P2P) 곧 연결하는 경우 NAT가 사용자의 로컬 PC에 열린 포트를 유지합니다.

해당 포트를 UDP로 열면 TCP를 사용할 수 있습니까?

Obs : Windows 32 및 Android로 컴파일하기 위해 Delphi XE5가 필요하므로 비 Windows 전용 솔루션이 필요합니다.

+0

나는 이것이 내가 원하는 것을 UPNP라고 불렀다. 따라서이를 처리 할 구성 요소가 이미 존재해야합니다. – PSyLoCKe

+0

참고 : http://embarcadero.newsgroups.archived.at/public.delphi.internet.winsock/201001/1001063144.html – Johan

답변

2

Microsoft는 uPNP를 통해 NAT 작업을위한 API를 제공합니다. 특히 포트 매핑을 할당하는 데 특히 유용합니다. IUPnPNAT 인터페이스와 해당 StaticPortMappingCollection 속성을 확인하십시오. IStaticPortMappingCollection.Add을 사용하여 NAT에 포트를 할당하십시오.

물론 이것은 uPNP가 켜져있는 라우터에서만 작동합니다. 모든 라우터가 uPNP를 전혀 지원하지 않거나 uPNP를 활성화 한 것은 아닙니다.

+0

고맙지 만 Windows에 바인딩되지 않는 솔루션이 있습니까? 나는 안드로이드 (XE5) – PSyLoCKe

+0

에서 Windows뿐만 아니라 그것을 사용하고 싶습니다. 그래서이 uPNP 가용성 문제는 제가 정말로 UDP 구멍 펀칭을 사용해야한다고 말합니다, 맞습니까? – PSyLoCKe

+1

Android에는 자체 uPNP API가 없으므로 타사 구현을 찾아야합니다 (무선 연결이 아닌 Wifi 연결에서만 작동합니다 (http://stackoverflow.com/questions/)). 10291759/upnp-nat-traversal-for-3g-4g-wireless-data-on-android)). 그러나 uPNP 지원 라우터를 사용하지 않을 경우에는 도움이되지 않습니다. 정말로 강건하기를 원한다면 큰 응용 프로그램처럼 응용 프로그램에서 여러 개의 NAT 통과 기법을 사용해야합니다 (구멍 펀칭은 여러 가지 중 하나입니다). –