怎么做基于Sock5的TCP代理?(100分)

  • 主题发起人 主题发起人 wheel
  • 开始时间 开始时间
W

wheel

Unregistered / Unconfirmed
GUEST, unregistred user!
看了rfc1928,我的做法如下:
1,接收到client端'05' '01' '00'消息,回应'05' '00';
2,收到client端消息05 01 00 01+目标IP+目标Port,回应 05 00 00 01 +我的IP+我分配
给client的Port.
3,client端就不响应了,请问我错在哪里?应该怎么写这个代理服务器呢?
 
居然到现在还没一个人答,富翁们都渡假去了?
我惨:(

要真没人答,我来创个十天无人答的纪录什么的也好玩。
SO,不准灌水,我要创纪录!^^
 
天呀,居然还是没人答。不是真的要我创纪录吧?
 
各位老大高抬贵手帮小弟一把呀,分少我再加呀。
//还好我是菜鸟,要不然我就学歪就歪了,呵呵。。
 
第一次出来想骗分,不好意思阿 *^_^*
据说这样分来得快!嘿嘿
 
你。。你。。你。。。。。。
害得我大喜大悲,罪孽深重呀!

放心好了,我是肯定不会给你分的,哈..哈。。哈哈。。。
 
不是不想回答,而是没做过这样的程序。另:我有一个很简单的问题,但就是没几个人回答,
拜托你也去看看吧。
 
如果有时间,今晚就能答
 
你是否确定1、2都成功了?

2有一个小问题,回应“05 00 00 01 +我的IP+我分配给client的Port”
应该是“我用来连目标的地址”、“我用来连目标的port”,
这个地址不一定和客户端连我的地址一样。就是说,比如
我有2个地址,内部网地址10.0.0.1,和internet地址202.96.1.1
内部网客户连上我的10.0.0.1地址,要求连internet的203.1.1.1
那么我是用202.96.1.1:3000 来连上目标的,那么返回给客户的
信息就是202.96.1.1:3000
不过这个问题应该不是client端不响应的原因。

你是否确定1、2都成功了?如果1,2都成功,本来就基本上成功了。
我要知道你的客户端用的什么程序?
如果是类似mail程序、ftp客户这样的东西,连接上最终目的
服务器后,是要首先等待目的服务器发送欢迎信息(确认信息),
客户端接收到欢迎信息后才发送请求信息的。
(举个例子,你连到ftp服务器,首先服务器发送“220 欢迎访问...”
客户端才能发user、pass命令,如果没有接收到欢迎信息,客户端
是等待的。)

所以,你的第2点应该这样:
(a)收到client端消息05 01 00 01+目标IP+目标Port
(b)我连接到目标IP、目标Port,
(c)连接成功后,回应 05 00 00 01 +我用来连目标的地址+我用来连目标的port
(d)然后,看目的主机有没有发过来数据,如果有,就应该立即转给
客户端了。
(要有一个变量指示目前进行到哪一步,也不要太心急,
不要搞得上面的(c)回应还没发完就开始(d)的转发工作了,
在(d)这步如果发现(c)还没做完,就应该先等待(c)完成)

 
多谢Pipi.可能是我没说清楚。

>>“我用来连目标的地址”、“我用来连目标的port”,
可是我用ClientSocket来连接目标的呀.怎么弄呢??

我是直接用的ServerSocket和ClientSocket.我的客户端是用OICQ来试的。
所以,我完成1,2之后,就把ServerSocket2的IP和端口返回给OICQ,我的想法
是用ServerSocket2来和OICQ通信,用ClientSocket来和OICQ的聊天室服务器通信。
然后互相转发,但是OICQ根本不去连我返回给他的ServerSocket2.
还请Pipi大侠继续指点。

还有,我返回的IP用的127.0.0.1,因为我本来就是在代理后,局域网代理用的
ms proxy2.0,本来就不需要设置代理就可以用。所以我想应该没问题。
当然更不应该因此客户端不响应.
 
》》但是OICQ根本不去连我返回给他的ServerSocket2
连接建立后怎么oicq还要另外连其他?它还是用最先连好的 1080(假使你的是1080) 端口
通信
 
最好是能再说清楚点了,比如这三方是否在同一个局域网中,
对了你不会是在客户端连着SERVERSOCKET是就去连SERVERSOCKET2了吧。
可能性很多了。你得说的详细的了。
 
to Pipi:
我设ServerSocket1端口为8000,ServerSocket2端口为8001.
启动OICQ时指定代理服务器:127.0.0.1:8000.OICQ登录成功,因为我UDP代理已写好。
然后进入OICQ聊天室,OICQ申请TCP代理,我完成最上面的1,2步,返回的是IP用:
127.0.0.1;端口用8001.也就是说其他OICQ连接ServerSocket2.然后没反应了.
OICQ聊天室显示连接成功,但收不到任何信息。
也就是说,OICQ要连接其他,而不是最先连好这个8000.
正如rfc1928及你上面说的,返回的IP可能不是本机而是另外的,当然我指定另一个IP
也是可以的吧?
或者说是根本上有问题?

to hspdel:我返回用127.0.0.1,当然OICQ和我的程序都在我的机器上,OICQ聊天室
服务器自然不可能和我在同一个局域网啦,不知道是我表达能力太差还是你没看清楚。
 
你搞错啦。
socks标准是,你的客户连上8000后,完成信息交换,
socks服务器告诉它用哪个端口连的最终目的,但是这个端口
是socks服务器用来连目的地址的,不是告诉客户、让客户来连的。
你的客户会仍然连在8000端口收发数据。

当然,客户仍然连在8000,你的8000端口可能会同时连几个客户,
你要用某种机制记录好哪个连接对应哪个和目的服务器的连接,
才能正确转发数据。(socks并不象ftp服务器,用其他端口来进行
数据通信)

另外你提到udp,你的最上面提到的1、2步骤的请求、应答是tcp的,
udp用另外的格式
 
谢谢Pipi.
不过这样子的话客户端就应该和我的ServerSocket2没有任何关系,那我返回给客户端的
IP和Port有什么用呢?而且我用ClientSocket连OICQ的服务器,而ClientSocket是没有
本地端口的,我该返回什么给OICQ呢?

小弟居然到现在都还没搞定,快绝望了。而且还冒出些莫名其妙的问题。
象在ClientSocket的OnRead里调用ServerSocket1.Socket.Connections.SendBuf.而
ServerSocket1的OnClientWrite不会响应,可能和控件有关,而另一个问题则百思不得
其解:居然现在在ServerSocket的OnWrite及ClientSocket的OnRead等事件中设置断点后,
既然程序执行到那里也不会中断,但ServerSocket的OnClientRead会响应,到其他机器
试也一样,为什么????????

还有,我现在用的异步通信方式,我想应该可以吧?

现在能收到OICQ聊天服务器返回的信息了,但不知道是否没转发到OICQ去,OICQ并不响应。

问题越来越多,我会另开帖子送分的。
 
最好是哪位大虾给小弟发一个DEMO.
200分求购。
Email:
dwheel@163.com

谢谢。
 
icq或者oicq我没用过,不知道它使用 tcp 还是 udp,或者两种都用了?
tcp和udp是不同的写法,如果oicq都用了他们,你的socks要能处理

demo,看我有没有空吧
 
OICQ都用了,udp代理已经写好了,只是tcp还没搞定.
 
接受答案了.
 

Similar threads

后退
顶部