2010-06-04 39 views
6

我有一個像在我的客戶端和實際視頻服務器(用C++編寫)之間運行的代理服務器(用java編寫)。客戶端發送的所有內容都通過此代理,然後重定向到服務器。重定向一個TCP連接

它工作正常,但我有一些問題,並認爲它會更好,如果我可以讓這個代理服務器只聽客戶端請求,然後以某種方式告訴服務器,從客戶端請求,並且它應該直接與客戶端建立連接。

基本上在TCP級別我希望發生是這樣的:

1-每當客戶端發送一個SYN到我的代理,代理只是將告訴IP和端口的報文到真實服務器的客戶。

2-服務器然後將相應的SYN-ACK發送到指定的客戶端,在客戶端和服務器之間建立直接連接。

然後,代理只會將初始請求(而不是後面的數據傳輸)中繼到實際的服務器。我只是不知道這是否可能。

非常感謝您

尼爾森R.佩雷斯

回答

1

你不必在這樣的用戶空間TCP握手的控制。這就是防火牆/路由器所做的事情,但這一切都發生在內核中。看看你的平臺的防火牆軟件 - 你可能甚至不需要編寫任何代碼。

2

這是非常某些遊戲(與霧溪的CoPilot)做到這一點,但它需要在服務器和客戶端上的支持。基本上,代理必須對客戶端和服務器說「嘗試直接在這個IP和這個端口上進行通信」,如果它們無法通過(因爲一個或兩個都在NAT或防火牆之後),它們會回退通過代理。

我找到了「點對點TCP打孔」就是很好的說明在http://www.brynosaurus.com/pub/net/p2pnat/

+0

好的,我回過頭來看 - CoPilot似乎沒有這樣做,或者如果他們這樣做,他們就停下來。請參閱https://www.copilot.com/tech/ – 2010-06-04 18:43:45

2

代理和服務器是否位於同一臺計算機上?如果是這樣,您可以使用套接字傳輸或文件描述符傳遞將連接傳遞給服務器。你可以在這兒用的例子,

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

如果他們是在不同的機器上,也沒有辦法通過連接到服務器。但是,可以使用VIP(虛擬IP)將IP數據包代理到服務器。這是低於套接字,所以你必須使用鏈接層接口,如DLPI