2012-08-06 7 views
1

클라이언트를 직접 연결하고 연결된 상태로 유지해야하는 곳에 응용 프로그램을 작성합니다. 우수한 기술 (Google)을 사용하여 조사를 한 후에 NAT-Punching 또는 NAT-Traversal을 수행하여 필요한 것을 얻을 수 있음을 알았습니다.TCP NAT-Traversal/- .NET을 사용한 펀칭

대부분의 사람들은 UDP를 통해 NAT-Punching을 사용하는 것 같지만, 제 경우에는 TCP로 이것을해야합니다 ("UDP가 아닌 이유"라고 묻기 전에 사실입니다). 이 샘플 코드 또는 적어도 적절한 자습서. 이론적 인 부속 점은 어디에서 찾을 수 있지만 소켓이나 TCPClients는 없다 (소켓을 선호한다.).

NAT 뒤에있는 두 개의 클라이언트를 연결하거나 샘플 코드로 전체 자습서를 연결할 수있는 샘플 코드를 누군가가 연결할 수 있습니까? 이 목표는 .NET에서 어렵다는 것을 알고 있습니다. (VB.NET을 사용하고 있지만 C#을 읽고 이해할 수는 있지만) 가능해야합니다.

UPnP는 보안상의 이유로 일부 NAT가 비활성화되어 있기 때문에 옵션이 아닙니다.

+0

원시 소켓으로 할 수있는 일이있을 수 있지만 작성하고 싶지는 않습니다. – CodesInChaos

+0

그래서 나는 라우팅을 알아 내야 만한다고 생각합니다. k thx! – Husky110

답변

1

원시 소켓에 액세스 할 수 없다면 TCP를 통해 NAT 펀치를 수행 할 수 없습니다. 일련 번호와 TTL 값을 사용하여 몇 가지 사소한 조작을해야 작동합니다. 그러나 원시 소켓을 악용하여 확산되거나 DDoS를 수행하는 맬웨어의 전단 볼륨으로 인해 XP SP2 이후의 모든 Windows 버전에서 운영 체제의 비 서버 버전에서는 Windows Raw 소켓이 허용되지 않습니다.

당신은 다음 중 하나를 수행합니다

  1. 사용 UDP 패킷 누락-요청을 다시하거나 허용하는 경우 손실 된 패킷을 처리하는 코드를 리팩토링 코드에 넣어.
  2. 중간 서버로 서버를 사용하여 스트리밍합니다.
  3. 하나의 끝이 원시 소켓을 만들 수 있어야합니다.
+0

구멍 펀칭 기술에는 원시 소켓이 필요하지 않습니다. 나는 winSock으로 성공적으로 해냈다. 물론 두 피어가 모두 연결할 수있는 중개자 서버가 필요합니다. –