2011-01-08 7 views
2

클라이언트가 TCP를 사용하여 서버에 연결하고 TCP/텍스트 채팅/채팅 룸 기능이 TCP로 수행되는 클라이언트 - 서버 음성 채팅 프로그램 (관리되지 않는 C++, win32)을 수행하는 동안 모든 audi 전송이 별도의 UDP/RTP 소켓 (JRTPLIB의 API 사용).C++ 홀 펀칭 UDP (RTP)

따라서 IP는 TCP 연결에서 알 수 있으며 연결이 설정된 후 RTP 소켓의 포트 번호를 보낼 수 있습니다.

문제는 TCP에서는 연결을 설정 한 후 서버에서 포트 포워딩을 수행해야하며 UDP에서는 recvfrom()을 사용해야합니다. afaik는 포트가 필요합니다. (멀티 플레이 게임이나 VoIP 클라이언트를 볼 때 필요하지 않습니다.)

UDP 홀 펀칭에 대해 이야기하는 출처 (예 : http://en.wikipedia.org/wiki/UDP_hole_punching)를 읽는 것은 좋지 않습니다. 예를 들어 그들은 서버와의 udp 대화 시작을 계속 언급합니다. 그것이 사실입니다. 클라이언트가 포트를 열지 않고도 서버와 udp 대화를 실제로 시작하려면 어떻게해야합니까? TCP에서 내가 언급했듯이()을 서버에 연결하면 통신이 가능합니다.

또한 UDP에서 RTP 빌드를 알고 있지만 UDP와 다른 RTP 구멍 펀칭 (다시, JRTPLIB 사용)에 대해 알아야 할 사항이 있습니까?

미리 감사드립니다.

+1

다소 혼란 스럽습니다. UDP 구멍 펀칭은 NAT 통과에 대해 수행됩니다. 즉, 피어 투 피어에 연결해야하고 두 피어가 개인 네트워크 (또는 라우터)에 앉아있을 때입니다. 이 서버는 두 클라이언트를 '매치 메이킹'하는 방법으로 만 사용됩니다. 그게 당신이하려는 일 이니? – zebrabox

+0

클라이언트가 포트를 열지 않고도 서버에 연결된 클라이언트간에 UDP/RTP 연결을 시도하고 있습니다. 내가 이해하는 바와 같이, 클라이언트는 IP/포트를 서버와 교환하고 클라이언트간에 직접 공유하여 서로 통신 할 수 있습니다. – KaiserJohaan

+0

"포트를 여는 것"은 무엇을 의미합니까? 의사 소통을 위해 열리는 항구가 있어야합니다, 그것은 udp hole punching이하는 일입니다. – nos

답변

3

"포트 열기"의 두 가지 가능한 정의가 있습니다. 하나는 UDP의 경우 bind() 또는 TCP의 경우 listen()으로 포트를 열고 다른 포트는 방화벽에서 포트를 여는 중입니다.

뭔가를 받기 위해 API 호출로 포트를 열어야합니다. 주위를 둘러 볼 방법이 없지만 아마도이 사실을 알고 있기 때문에 방화벽에서 포트를 여는 것을 의미한다고 생각합니다. 그러나 통신 (클라이언트)을 시작하는 쪽에서이 작업을 수행 할 필요는 없습니다. 방화벽이 매우 편집적인 모드로 설정되어 있지 않으면 TCP와 UDP에 모두 적용됩니다. 합당한 방화벽은이 포트에서 이전에 같은 서버로 보낸 데이터 그램이있는 경우 서버에서 UDP 포트로의 응답을 허용합니다. 양측이 NATing 방화벽/라우터 뒤에있는 경우에만 구멍 펀칭이 필요합니다. Skype가 그렇게합니다.

또한 recvfrom()과 같은 것들을 신경 쓰지 않아도됩니다. UDP 소켓을 bind() 한 다음 TCP와 똑같은 방법으로 connect()와 recv()/send() 또는 read()/write()를 사용할 수 있습니다.

+0

나는 그것을 이해한다. 클라이언트의 경우이 연결을 connect() 설정하거나 실제로 해당 포트에서 패킷 수신을 허용하기 위해 방화벽에 보낼 내용()을 보내야합니까? – KaiserJohaan

+0

@Kaiser, 아니오, UDP는 연결없는 프로토콜이므로 모든 connect() 호출은 보내거나받을 기본 주소를 설정하기 만하므로 매번 지정하지 않아도됩니다. 그래서 먼저 뭔가를 보내야합니다. –

+0

알겠습니다. 고마워, 이걸 시험해 볼거야! – KaiserJohaan