정말 짧은 지식으로 홀펀칭질문입니다

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
amadeusj
Posts: 170
Joined: 2006-07-14 16:59
Contact:

정말 짧은 지식으로 홀펀칭질문입니다

Post by amadeusj »

온라인 캐주얼 슈팅 게임을 게발하려 합니다
그래서 전투중에는 p2p 연결을 하려합니다
저는 그냥 맘편하게 tcp 로 p2p 을 하려 했는데 사수가 udp 로 하라고 해서 이리저리 글들을 찾아보았습니다

그래서 홀펀칭을 알아봤는데
누군가 이런글을 적었더군요


1. A와 B가 서버로 TCP를 통해 접속하게 만들어 봅시다.
2. 사용자 A와 B가 UDP로 통신하고 싶을때에 서버로 UDP를 쏘게 합시다.
(물론 서버는 UDP 쓰레드가 따로 하나 필요하겠죠..)
3. UDP 쓰레드에서 A와 B로부터 UDP 패킷을 받으면 TCP로 그만 쏘라고 보냅니다.
(이건 뮤텍스나 락을 걸어서 각각의 쓰레드가 안전하도록 잘 설계합니다.)
4. TCP로 A와 B에게 상대방의 공인아이피와 포트를 알립니다.
5. A와 B는 서로의 공인아이피로 UDP 통신을 합니다.

질문1 : 위의 방법이 맞나요?

질문2 : 홀펀칭이라는게 소프트웨어적으로 어떻게 하는게 아니라 공유기가 내부적으로 처리 하는건인가요??

질문3 : 위의 방법으로 하다가 클라이언트쪽에서 UDP 패킷이 오지 않으면 RelayServer 를 사용해야하는건가요?

질문4 : 그렇다면 RelayServer 는 클라이언트를 중계해주는 건데 UDP 로 해야 하나요? 아님 TCP 로 해야하나요?

질문이 좀많네요...
질문을 제대로 했는지도 모르겠어요..UDP 구현은 한번도 안해봐서요~
좋은 답변 기다리겠습니다~
imays
Posts: 1044
Joined: 2003-02-18 10:29
Contact:

Re: 정말 짧은 지식으로 홀펀칭질문입니다

Post by imays »

답변1: 여러가지 다른 방법도 있겠습니다만, 저 방법도 맞습ㄴ다.
답변2: 네.
답변3: 네
답변4: UDP가 권장됩니다.
온라인 게임 서버 엔진 ProudNet
http://www.nettention.com
amadeusj
Posts: 170
Joined: 2006-07-14 16:59
Contact:

답변 감사합니다...근데.

Post by amadeusj »

1. A와 B가 서버로 TCP를 통해 접속하게 만들어 봅시다.
2. 사용자 A와 B가 UDP로 통신하고 싶을때에 서버로 UDP를 쏘게 합시다.
3. UDP 쓰레드에서 A와 B로부터 UDP 패킷을 받으면 TCP로 그만 쏘라고 보냅니다.
4. TCP로 A와 B에게 상대방의 공인아이피와 포트를 알립니다.
5. A와 B는 서로의 공인아이피로 UDP 통신을 합니다.

이런식으로 p2p 연결을 하는데
2번에서 A가 서버에게 UDP 패킷을 보냈는데 서버에서 받지못하는경우 A와 B의 p2p연결을 RelayServer 를 사용해야 하는건가요?

A의 UDP 패킷을 서버가 받지 못했는데 어떻게 RelayServer 를 사용할수 있다는거죠?
moonhalo
Posts: 146
Joined: 2006-03-28 10:15

Re: 답변 감사합니다...근데.

Post by moonhalo »

amadeusj wrote: 4. TCP로 A와 B에게 상대방의 공인아이피와 포트를 알립니다.

이런식으로 p2p 연결을 하는데
2번에서 A가 서버에게 UDP 패킷을 보냈는데 서버에서 받지못하는경우 A와 B의 p2p연결을 RelayServer 를 사용해야 하는건가요?

A의 UDP 패킷을 서버가 받지 못했는데 어떻게 RelayServer 를 사용할수 있다는거죠?
위위 질문3에서 서버가 UDP 패킷을 못 받는게 아니라,
클라이언트가 다른 클라이언트의 메세지를 못 받을 때 릴레이 서버를 사용한다는 것 입니다.
서버는 공인 IP에 물려 있을 테니 UDP 패킷을 항상 받을 수 있다고 생각합니다.
(이게 안되면 아무것도 안되죠. TCP 연결도 안될 테고. ㅎㅎㅎ)

그리고, 서버가 알려주는건 공인 연결점(아이피:포트 쌍)과 사설 연결점 두 정보입니다.
공인 연결점은 서버에게 보이는 연결점이고(클라이언트가 공유기에 물린 경우 공유기의 외부 연결점),
사설 연결점은 클라이언트가 알고 있는 자신의 연결점(공유기에 물린 경우 사설 아이피)입니다.

사설 연결점 정보는 클라이언트가 서버로 보내야 합니다.

두 연결점 정보를 받은 클라이언트는 두 점 모두로 패킷을 보내보고,
응답이 있는 연결점을 이용해 통신하면 됩니다.
amadeusj
Posts: 170
Joined: 2006-07-14 16:59
Contact:

아그렇군요.

Post by amadeusj »

A와 B의 ip, port 정보를 서버가 받아서 각각에게 알려주어서 A, B 서로 udp 연결을 시도해서 안될경우 RelayServer 를 이용하는 것이군요
답변 감사합니다~
이재식
Posts: 685
Joined: 2002-09-11 03:12

Post by 이재식 »

TNL 값싼 네트웍라이브러리 권합니당.
(많은 부분에서 일손을 줄여줄것이라고 생각됩니다.)
이재식/전주: 김제에서농사짓습니다.
Locked