重定向TCP连接

时间:2010-06-04 18:35:35

标签: java c++ tcp connection

我的客户端和实际的视频服务器(用c ++制作)之间运行的代理服务器(用java编写)。客户端发送的所有内容都通过此代理进行,然后重定向到服务器。

它工作正常,但我有一些问题,并认为如果我能使这个代理服务器只听取客户端请求然后以某种方式告诉服务器已经从客户端发出请求会更好并且它应该直接与客户端建立连接。

基本上在TCP级别,我想要发生的是这样的事情:

1-每当客户端向我的代理发送SYN时,代理只会向真实服务器发送一条消息,告诉客户端的IP和端口。

2-服务器然后将相应的SYN-ACK发送到指定的客户端,在客户端和服务器之间建立直接连接。

然后代理只是将初始请求(但不是后来的数据传输)中继到实际服务器。我只是不知道这是否可能。

非常感谢

Nelson R. Perez

3 个答案:

答案 0 :(得分:3)

这与一些游戏(和Fog Creek CoPilot)的做法非常相似,但它需要服务器和客户端的支持。基本上代理必须对客户端和服务器说“尝试直接在这个ip和这个端口上进行通信”,如果他们无法通过(因为其中一个或两个都在NAT或防火墙后面),他们会回归到通过代理。

我在http://www.brynosaurus.com/pub/net/p2pnat/

找到了“点对点tcp打孔”这个很好的描述

答案 1 :(得分:3)

代理和服务器是否位于同一台计算机上?如果是这样,您可以使用Socket Transfer或文件描述符传递将连接传递给服务器。你可以在这里找到C中的例子,

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

如果它们位于不同的计算机上,则无法将连接传递给服务器。但是,可以使用VIP(虚拟IP)将IP数据包代理到服务器。这是在套接字下面,所以你必须使用链接层接口,如DLPI

答案 2 :(得分:2)

您无法像这样控制用户空间中的TCP握手。这就是防火墙/路由器所做的事情,但这一切都发生在内核中。看看您的平台的防火墙软件 - 您甚至可能不需要编写任何代码。