UDP包如何绕过代理服务器(高手请进) (200分)

  • 主题发起人 主题发起人 凝铁衣
  • 开始时间 开始时间

凝铁衣

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我编写了一个远程控制的软件,可以看到别人的屏幕、控制对方的鼠标、键盘、
上传或下载文件……,总之在局域网内可以良好地运行,实现对其它机器的完全控制。
在广域网上,如果对方和自己都是拨号也没有问题,但是如果有一方通过代理上网,
则有代理的一方不能收到另一方的返回信息,为解决这个问题我已经度过了N个不眠
之夜了,望高手们点拨一二,万般感谢,不惜代价,高分赠送!
 
sorry,上面的这个不便于观看,重新发一条
最近我编写了一个远程控制的软件,可以看到别人的屏幕、控制对方的鼠标、键盘、
上传或下载文件……,总之在局域网内可以良好地运行,实现对其它机器的完全控制。
在广域网上,如果对方和自己都是拨号也没有问题,但是如果有一方通过代理上网,
则有代理的一方不能收到另一方的返回信息,为解决这个问题我已经度过了N个不眠
之夜了,望高手们点拨一二,万般感谢,不惜代价,高分赠送!
 
其实这是因为跨网关的缘故。
具体解决的办法是:“在有真正IP地址的主机上编写一个获取一个客户端IP和端口的中转程序”。
 
能不能具体一点?
假设我的局域网IP为192。168。4。1,网关为192。168。0。250,
代理服务器的广域网IP为61。154。145。244;
对方为拨号上网,对方可以正常地收到我的数据,但我试过在对方机器上往
192。168。4。1或61。154。145。244发送UDP包,结果我的机器都收不到返回包。
(注:使用QQ我和对方可以正常的通信,另外如果双方都走代理又如何?)
 
To 凝铁衣:

udp控件在接受数据的时候可以取出信息发送端的ip地址和端口号。
例如:
(1)局域网:用192.168.0.2的3000端口向192.168.0.1的8000发送信息,当192.168.0.1
收到信息是就可以取出信息发送端的ip地址为192.168.0.2,端口是3000,
所以你可以用此地址和端口回传信息。
(2)广域网:通过代理服务器上网的节点在代理服务器上可以自动映射。假设我通过
61.139.60.41代理服务器上网,我的电脑ip地址是156.168.13.128,当我
用156.168.13.128的3000端口向61.139.60.105的8000端口发送信息,在
61.139.60.105上收到信息时取出的信息发送端的ip地址为61.139.60.41,
端口是56789(次端口动态分配--存在于你的程序的生存期),你可以向
61.139.60.41的56789端口发送信息,那么代理服务器将自动中转,所以
收到信息的节点将是156.168.13.128上的3000端口处的监听程序。
明白了吗?
我下班了,如果还有问题的QQ:9064100,我下午两点上班。
祝你好运!

 
其实这是一个Proxy工作原理的问题,以下
C表示客户端,S表示服务器,
CP表示客户端代理,SP表示服务器端代理
1.C要发送UDP消息,指定S.IP, S.Port
2.C建立与CP的TCP联系,CP.IP, CP.Port(此Port为CP随机选取,建立Port与C的映射)
3.C发送UDP数据到CP.IP, CP.Port
4.S建立与SP的TCP联接,SP.IP, SP.Port(此Port为SP随机选取,建立Port与S的映射)
5.CP发送UDP包到SP.IP, SP.Port(上面选择的Port)
6.SP收到数据包,根据Port的映身关系决定发到S.IP, S.Port
完成传递。。。
Proxy是一套协议,所以,建议你去看一下相关的资料。
http://www.socks.nec.com/
这个链接有详细的关于proxy的资料。。。

祝你好运
 
补充说一句:
在整个运行期间,只要C或S都在运行,则C.IP, C.Port --> CP.IP, CP.Port的映射
与S.IP, S.Port --> SP.IP, SP.Port的映射一直存在,
并且为第三方所知。
如QQ中,通讯双方的映射关系都为QQ服务器所知。。。
这样,才可能双方都在代理后面,否则,则需要有一方不在代理后面,
而在代理后面的一方,发送消息给不在代理后面的一方,然后,接到到此消息后,
接收方知道了发送方的IP,port与代理的映射关系。。。
通讯即可正常。。。
 
接受答案了.
 
后退
顶部