关于 SOCKET5 协议代理服务器的一个问题

lzg0001 2008-10-10 11:42:13
从没搞过代理服务器编程,最近想学习一下。

首先,我说一下我对代理服务器通信过程的理解(SOCKET5):
1.客户端连接到代理服务器开放的端口;
2.客户端向代理服务器发送验证申请;
3.代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4.客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5.代理服务器开始进行到目的主机的真正连接;
6.代理服务器为客户端开放一个新的端口并向客户端发送一个数据包告知客户端这个新的端口;
7.客户端创建一个新的套接字并连接到代理服务器的新的端口;
8.然后,代理服务器把由新端口接收到的数据都转发给目的主机,把从目的主机发过来的数据都由新端口转发给客户端。


再说一下我的实验:
服务器程序、代理服务器程序、客户端程序都在一台电脑上运行;
服务器是我自己写的,只接受连接然后把收到的内容原样发回去,监听 6000 端口;
代理服务器用的 CCPolicy;

问题:
在上面的步骤中,客户端连接到代理服务器、验证都没问题,然后客户端向代理服务器请求对目的主机的连接,代理服务器真实地连接到了目的主机程序,然后代理服务器向客户端发回一个新的 IP&端口,但客户端再创建新的 SOCKET 连接这个数据包所指定的 IP&端口 时总是失败,而且查看代理服务器的网络连接状态,也没有发现有这个与客户端的新的连接的存在(附图)。

不知道是我自己的理解不对,还是具体步骤有问题,资料很少,请各位不咅赐教,谢谢!
...全文
1272 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzg0001 2008-10-10
  • 打赏
  • 举报
回复
谢谢 WinEggDrop!先这样吧,我再试试,有问题再请教您!
WinEggDrop 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lzg0001 的回复:]
谢谢 WinEggDrop!

我又试了下,确实是您说的那样的!

代理服务器是 ccpolicy,写错了!

我不懂是什么模式,应该就是你说的“CONNECT模式(TCP)”吧,我就是创建一个套接字,然后 connect/recv & send。

用 SOCKET4 、HTTP 协议代理时,是不是只要修改步骤 1--5 中与代理服务器通信的数据包格式就可以了?
[/Quote]

socks4中没有验证的.socks4好象也不支持域名解析,不支持UDP.http协议代理是有验证的,http代理数据包你得遵从http协议的格式发送数据过去,http也有几种模式的,CONNECT,GET,POST.不过这些是协议格式问题了,基本原理也是差不多的数据转发.

lzg0001 2008-10-10
  • 打赏
  • 举报
回复
谢谢 WinEggDrop!

我又试了下,确实是您说的那样的!

代理服务器是 ccpolicy,写错了!

我不懂是什么模式,应该就是你说的“CONNECT模式(TCP)”吧,我就是创建一个套接字,然后 connect/recv & send。

用 SOCKET4 、HTTP 协议代理时,是不是只要修改步骤 1--5 中与代理服务器通信的数据包格式就可以了?
WinEggDrop 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lzg0001 的回复:]
我又想到一点:
是不是代理服务器真正连接到目的主机后,客户端与代理服务器仍采用原先的连接进行通信?


但真的这样的话,又有一个新问题:
客户端怎样通知代理服务器通信结束、断开连接,代理服务器连通后对数据包应该是透明的,不会再监视数据包的内容了。
难道客户端只是要粗暴地断掉与代理服务器的连接就可以了吗?
[/Quote]

没有通知,就如你所想.通信结束时直接断开.代理服务器无论是客户端还是目的服务器方断开连接,都标志着这条通信通道已经完成,要断开.
还有,代理软件应该是ccproxy,没听说过一个ccpolicy的代理软件.
WinEggDrop 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 lzg0001 的帖子:]
从没搞过代理服务器编程,最近想学习一下。

首先,我说一下我对代理服务器通信过程的理解(SOCKET5):
1.客户端连接到代理服务器开放的端口;
2.客户端向代理服务器发送验证申请;
3.代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4.客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5.代理服务器开始进行到目的主机的真正连接;
6.代理服…
[/Quote]

SOCKS5有三种模式的.
1.CONNECT模式(TCP) 最常用
2.BIND模式(TCP) 不常用
3.UDP ASSOCIATION模式 UDP唯一模式,如果是UDP协议的话,只会用这模式.

如果你说的是CONNECT模式,我就说下这个模式的流程.

1.客户端连接到代理服务器开放的端口;
2.客户端向代理服务器发送验证申请;
3.代理服务器向客户端发送一个数据包,从而客户端得知自己的通信申请是否被批准;
4.客户端向代理服务器发送一个数据包,告知代理服务器自己要连接的目的主机的地址和端口;
5.代理服务器开始进行到目的主机的真正连接;
你写的1-5都没问题,但到第6步就有问题了.
6.代理服务器连接到目标主机后,就会返回一个10 byte长的数据给客户端,起始为0x05 0x00,0x00,0x01,XX,XX,XX,这样代表代理服务器已经连接上目标服务器了.
7.代理服务器现在处理数据转发中,客户端<->代理服务器<->目标主机,代理服务器从客户端接收数据,转发到目标主机;代理服务器人目标主机接到数据,转发给客户端.这里不存在什么新端口.

如果你说的不是CONNET模式,那么你要说清楚是哪种模式.

lzg0001 2008-10-10
  • 打赏
  • 举报
回复
我又想到一点:
是不是代理服务器真正连接到目的主机后,客户端与代理服务器仍采用原先的连接进行通信?


但真的这样的话,又有一个新问题:
客户端怎样通知代理服务器通信结束、断开连接,代理服务器连通后对数据包应该是透明的,不会再监视数据包的内容了。
难道客户端只是要粗暴地断掉与代理服务器的连接就可以了吗?
lzg0001 2008-10-10
  • 打赏
  • 举报
回复
好像看不到图
lzg0001 2008-10-10
  • 打赏
  • 举报
回复

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧