2014-07-08 6 views
1

나는 잠시 동안 신뢰성을 제공하는 간단한 UDP C++ 라이브러리를 찾고 있습니다. 나는 지금 막 완벽하게 보인 ENet를 만났는데, 문서에서 NAT 구멍 펀칭에 대한 지원을 찾을 수 없다는 것을 제외하고는 완벽하다. 인터넷에서이 문제를 논의하는 사람이있는 것 같지만 가능한지 확실한 답을 찾지 못했습니다.NAT 구멍 펀칭 ENet

이미 클라이언트에 외부 ips & 포트를 배포하도록 구성된 타사 서버가 있습니다.

가능한 경우 누군가 프로세스를 설명하는 의사 코드/단계를 제공 할 수 있습니까?

답변

2

나는 이것을 알아 냈다. 여기에 내가했던 일이야 :

  1. 는 제 3 자 서버에 현재 클라이언트
  2. 연결 호스트를 만들기
  3. 다른 클라이언트가 제 3 자 서버에 연결, 그것은 각각의 클라이언트에 다른 클라이언트 정보를 전송
  4. 피어 주소를 수신하면 각 피어는 서버에 연결하는 데 사용 된 것과 동일한 소켓의 다른 피어에 연결을 시도하고 해당 주소로 패킷을 보내기 시작합니다. 이것은 처음에는 내 문제였습니다. 나는 단지 두 개의 패킷만을 보내고 있었고 쉽게 잃어 버릴 수있었습니다. 연결은 시간의 절반 만 작동합니다. 연결이 성공하거나 실패 할 때까지 패킷을 보낸 스레드가 생성되었습니다.
  5. 연결이
+0

좋은 생각! – JSON

-1

UDP는 패킷을 삭제할 수 있으며 패킷을 순서없이 전송할 수 있습니다. 패킷을 주문하는 것은 간단합니다. 그러나 패킷이 삭제 된 경우 복구 할 수있는 방법이 없습니다. 그러나 UDP를 사용하는 많은 시스템에서는 중복 데이터가있는 다른 스트림을 제공합니다. 이 경우 보조 스트림을 사용하여 백업을 작성한 다음 첫 번째 스트림에서 삭제 된 패킷이 두 번째 스트림에서 사용 가능한지 확인하십시오.

+0

을 전송되는 몇 패킷 후 수립되어야한다이 것 가능성이 그가 선택한 이유 [ENET] (http://enet.bespin.org/index.html) ... – JSON

+0

두 UDP 않는 한 "스트림"은 두 개의 서로 다른 경로를 사용하는 방법을 찾고 패킷에서 동일한 손실이 발생할 가능성이 높습니다. 이는 스트림 1과 스트림 2의 패킷 [x]가 거의 동일한 시간에 동일한 라우터를 통과하기 때문입니다. 도중에 라우터가 패킷을 덤프하면 패킷 [x]을 두 스트림에서 모두 삭제합니다. 사실, 두 스트림 모두 패킷 [x-5]을 패킷 [x + 5]에 쉽게 떨어 뜨릴 수 있습니다. 이 범위의 패킷 중 일부가 하나의 스트림이 아닌 다른 스트림에서 생성 될 가능성이 있지만 두 스트림 사이에 도착하는 모든 패킷을 계산할 수있는 기회가 충분하지 않습니다. – JSON