2010-06-04 8 views
6

내 클라이언트와 실제 비디오 서버 (C++에서 만든) 사이에서 실행되는 프록시 서버 (java로 작성)와 비슷한 것을 가지고 있습니다. 클라이언트가 보내는 모든 것은이 프록시를 거쳐 서버로 리디렉션됩니다.TCP 연결 리디렉션

잘 작동하지만 몇 가지 문제가 있으며이 프록시 서버를 클라이언트 요청 만 듣고 클라이언트 측에서 요청이 이루어진 것으로 서버에 알리는 것이 더 좋을 것이라고 생각합니다. , 그리고 그것은 클라이언트와의 직접적인 연결을 생성하기로되어있다.

클라이언트가 내 프록시에 SYN을 보낼 때마다

1, 프록시 그냥 IP 및 포트를 말하는 실제 서버에 메시지를 보냅니다 나는 일이 원하는 무엇을 TCP 수준에서 기본적으로

이 같은 것입니다 클라이언트의

2- 서버는 클라이언트와 서버 간의 직접 연결을 생성하는 지정된 클라이언트에 해당 SYN-ACK를 보냅니다.

그러면 프록시는 실제 서버로 초기 요청 (나중에 데이터 전송은 아님)을 중계합니다. 가능한지 모르겠습니다.

당신에게 대단히 감사합니다

넬슨 R. 페레즈 매우 일부 게임 (그리고 안개 크릭 부조 종사가) 그것을 할 방법입니다,하지만 서버와 클라이언트 모두에 대한 지원이 필요

답변

1

에서 "TCP 홀 펀칭을 피어 투 피어"의 좋은 설명을 발견했다. 이것은 방화벽/라우터가하는 일이지만 커널에서 일어납니다. 플랫폼에 맞는 방화벽 소프트웨어를 살펴보십시오. 코드를 작성하지 않아도됩니다.

2

. 기본적으로 프록시는 클라이언트와 서버에 "이 IP와이 포트에서 직접 통신을 시도하십시오"라고 말하고 그들이 통과 할 수 없으면 (하나 또는 둘 다 NAT 또는 방화벽 뒤에 있기 때문에) 프록시를 통해.

나는 당신이 그런 유저 랜드에서 TCP 핸드 쉐이크 제어 할 수 없습니다 http://www.brynosaurus.com/pub/net/p2pnat/

+0

좋아, 나는 그것을 뒤로 가져 간다. CoPilot이 그렇게하지 않는 것처럼 보이거나 그렇지 않으면 멈춘다. https://www.copilot.com/tech/를 참조하십시오. –

2

프록시와 서버가 같은 컴퓨터에 있습니까? 그렇다면 Socket Transfer 또는 File Descriptor Passing을 사용하여 서버에 연결을 전달할 수 있습니다. 당신은 그들이 서로 다른 컴퓨터에있는 경우, 서버에 연결을 전달하는 방법이 없습니다

http://www.wsinnovations.com/softeng/articles/uds.html

, 여기에 C에서 예를 찾을 수 있습니다. 그러나 VIP (가상 IP)를 사용하여 IP 패킷을 서버에 프록시 할 수 있습니다. 이것은 소켓 아래에 있으므로 DLPI과 같은 링크 계층 인터페이스를 사용해야합니다.