实现Sock5代理

采用stun方式和sock5穿越防火墙,来保证能在防火墙条件下通过.zip 立即下载

实现Sock5代理

有很多公司不能直接和Internet相连,必须通过代理和www连接,浏览、下载资料。
代理服务器支持的协议也有所不同,有支持Sock、HTTP代理的这样我们做的客户端软件就需要支持这些代理,使用户能够通过这些代理透过防火墙和外网相连,一般Sock分为Sock4和Sock5,这里我们只实现Sock5协议。
RFC1928描述了Socks协议的细节,告诉我们客户程序如何同Socks代理协商,取得透过该协议对外传输的途径。英文的URL为: http://www.ietf.org/rfc/rfc1928.txt,建议先了解以上链接内容后在阅读下文。另外给大家推荐学习协议的好地方: http://www.cnpaf.com中国协议分析网,有很多好东东,可以去看看。
下面说明一下实现的方法。
代理的实现方法实际就是Socket编程,只要通讯时遵循它们的协议就可以。首先理解它们的协议是关键。
示意图:

1.1    Sock5协议实现

1.1.1        Sock5协议内容

1.  客户端首先要与代理服务器连接,连接后要向代理发送版本号、认证方法、方法选择格式如下:
版本号(1字节) |  供选择的认证方法(1字节)  |  方法序列(1-255个字节长度)
如果你支持的版本为SOCK5那么版本号就为0x05;可供选择的方法是指你的协议支持几种认证方式,因为我们实现只支持一种所以就填0x01,如果你是两种就写0x02;认证方法序列包括(0x00为不需认证、0x02为需要用户名和密码认证,通常是这两种,如果想了解更多请参看Rfc1928)。
这样组合你的报文应该为:0x05 0x01 0x00
如果需要认证那么为:0x05 0x01 0x02
2.  代理接收到客户端的请求,会向客户端返回信息,格式为:
版本号 | 服务器选定的方法
如果服务器支持验证方式,返回的报文为:
0x05 0x02
3.  接下来根据服务器的验证方式,发送验证信息了,报文格式为:
0x01 | 用户名长度(1字节)| 用户名(长度根据用户名长度域指定) | 口令长度(1字节) | 口令(长度由口令长度域指定)
4.  服务器接收信息后进行验证,返回如下格式:
0x01 | 验证结果标志
验证结果标志:0x00表示验证成功,其他值均为错误码

1.1.2        Sock5协议实现

根据上面所述的步骤和协议内容,就可以实现SOCK5代理了。下面我给出我写的实现SOCKT5代理的函数代码和注释,供参考(delphi6+win2K+sp4调试通过,代理服务器用的是CCProxy6.0)
function TBZSock5ProxyApi.SetProxy(ASocket: Pointer): Integer;
var
  proxyUser, proxyPwd: String;
  bIsValid: Boolean;
  sock: 
^ TSocket;
  sockServer: TSockAddrIn;
  command: array [
0 .. 9 ] of Byte;
  re, len, ulen, plen: Integer;
//   buffer: PByte;
  buffer: array [ 0 .. 1023 ] of Byte;
begin
  sock :
=  ASocket;
  
if  FProxyParam.GetServer  =   ''  then
  begin
    Result :
=   0 ;
    Exit;
  end
  
else
  begin
    Result :
=   0 ;
    sock
^  : =  socket(AF_INET, SOCK_STREAM,  0 );
    
if  sock ^   =  INVALID_SOCKET then
    begin
      Result :
=   1 ;
      Exit;
    end;
 
    sockServer.sin_family :
=  AF_INET;
    sockServer.sin_port :
=  htons(FProxyParam.GetPort);     // 将整形数变为网络字节流
    sockServer.sin_addr.S_addr : =  inet_addr(PChar(FProxyParam.GetServer));
 
    
// 连接远程主机
     if  WinSock.connect(sock ^ , sockServer, SizeOf(sockServer))  <>   0  then
    begin
      Result :
=   1 ;
      Exit;
    end;
 
    bIsValid :
=  FProxyParam.GetProxyValid;
 
    
// 发送SOCK5协议指令
    FillChar(command,  10 ,  0 );
    command[
0 ] : =   5 ;
    
if  bIsValid then
      command[
1 ] : =   2
    
else
      command[
1 ] : =   1 ;
    
if  bIsValid then
      command[
2 ] : =   2
    
else
      command[
2 ] : =   0 ;
 
    
// 发送登陆指令
     if  bIsValid then
      re :
=  WinSock.send(sock ^ , command,  4 ,  0 )
    
else
      re :
=  WinSock.send(sock ^ , command,  3 ,  0 );
    
if  re  =  SOCKET_ERROR then
    begin
      Result :
=   1 ;
      Exit;
    end;
 
    
// 接收返回的消息
    fillchar(command,  10 ,  0 );                          // 接收前用0再次填充
    re : =  WinSock.recv(sock ^ , command,  2 ,  0 );
    
if  re  <>   2  then
    begin
      Result :
=   1 ;
      Exit;
    end;
    
if  command[ 1 ] = $FF then
    begin
      Result :
=   1 ;
      Exit;
    end;
 
    
if  (not bIsValid) and (command[ 1 ] = 0 ) then
    begin
      Exit;
    end;
 
    proxyUser :
=  FProxyParam.GetUsername;
    proxyPwd :
=  FProxyParam.GetPassword;
 
    
if  command[ 1 ]  <>   0  then
    begin
      
if  command[ 1 ]  <>   2  then
      begin
        Result :
=   1 ;
        Exit;
      end;
      
if  bIsValid then
      begin
        ulen :
=  Length(proxyUser);
        plen :
=  Length(proxyPwd);
        len :
=   3   +  ulen  +  plen;
        fillchar(buffer, 
1024 ,  0 );
 
        buffer[
0 ] : =   5 ;
        buffer[
1 ] : =  ulen;
        StrPCopy(@buffer[
2 ], proxyuser);
        buffer[
2   +  ulen] : =  plen;
        StrPCopy(@buffer[
2   +  ulen  +   1 ], proxyPwd);
 
        
// 发送验证信息
        re : =  send(sock ^ , buffer, len,  0 );
        
if  re  =  SOCKET_ERROR then
        begin
          Result :
=   1 ;
          Exit;
        end;
 
        
// 接收验证返回信息
        fillchar(command,  10 ,  0 );
        re :
=  recv(sock ^ , command,  2 ,  0 );
        
if  ((re <> 2 ) or ((command[ 0 ] <> 1 ) and (command[ 1 ] <> 0  ))) then
        begin
          Result :
=   1 ;
          Exit;
        end;
      end   
// if bisValid
       else
      begin
        Result :
=   1 ;
        Exit;
      end;                     
//
    end;  //  if command[1]<>0
  end;   // end first if
 
end;
上面的函数中有一个FproxyParam变量,它是代理参数的值对象,声明如下:
  TProxyParam 
=   class
  
private
    FUsername,        
// 代理验证用户名
    FPassword,         // 代理验证密码
    FServer: String;     // 代理服务器地址
    FPort: Integer;      // 代理服务器端口号
    FIsValid: Boolean;   // 是否验证     如果代理服务器是验证的,那么此值应该为true
 
    procedure Clear;
  
public
    constructor Create;
    procedure SetUsername(AUsername: String);
    procedure SetPassword(APassword: String);
    procedure SetServer(AServer: String);
    procedure SetPort(APort: Integer);
    procedure SetProxyValid(AValid: Boolean);
 
    function GetUsername: String;
    function GetPassword: String;
    function GetServer: String;
    function GetPort: Integer;
    function GetProxyValid: Boolean;
  end;
使用此函数:
假设已经创建了一个ClientSocket1(TclientSocket对象),它的IP和Port设置为代理服务器的IP和Port,那么就有下面的代码:
......
Var
Re:Integer;
Begin
Re:
= SetProxy(@(ClientSocket.Socket.SocketHandle)) ;   // 如果验证成功,那么就可以用返回的//socket进行相应的通讯
If Re = 0  then 
Begn
  ShowMessage(‘Sock5 is ok’);         
// 代理服务器就会有连接的数据流显示
End
Else begin
  ShowMessage(‘Sock5 is error’);
End;
End;
……
上面的例子如果设置代理成功,那么代理服务器就会有连接的数据流显示。表示与代理服务器有数据交换,如果没有成功则务数据流显示。
 
 
                                                               李孟岩
                                                                      mengyan_yl@sohu.com
                                                                                    2005-07-05
华为2288H V5服务器断电后‘趴窝’?别慌,手把手教你用SmartKit+BMC修复工具搞定 本文详细介绍了华为2288H V5服务器在断电后无法启动的修复方法,通过SmartKit和BMC修复工具进行故障诊断与修复。文章提供了从工具获取、安装到具体修复流程的完整指南,帮助运维人员快速恢复服务器运行,并给出了后续加固与预防措施,确保服务器稳定运行。 阅读详情

相关推荐

锐浪报表 Grid++Report 子报表 Delphi

锐浪报表 Grid++Report 是国内较好的报表控件,本人一直使用它,做出很多特色的报表。可以说你的报表设计出来,它基本上能做出来。 但是它帮助文件上,说的不深,近期因为要做一个有关社工的报表,大表中,嵌套2个子表。可以说,一个表到三个数据集,分别打印。 在认真看了帮助的基础上,网上探索,基本无此类,特别是Delphi的帮助,几乎为零。经二天摸索,做出来了。 一、设计思路 1、大表和二个小表,可以设计为三个表,分别使用三个GridppReport控件,取名...

lyhoo163的专栏 9075

Socks5工作原理与搭建

Socks5协议是一款广泛使用的代理协议,它在使用TCP/IP协议通讯的客户端和服务器之间扮演一个中介角色,使得内部网中的客户端变得能够访问Internet网中的服务器,或者使C/S(Client和Server)之间的通讯更加安全。SOCKS5 代理服务器通过将客户端发来的请求转发给真正的目标服务器, 模拟了一个客户端请求操作。

顺其自然~专栏 4307

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

socks5学习

------------本文仅用于学习记录使用。

abcdefglouy的博客 1564

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1438

车载与安防项目实战:如何用RK3588搭配NVP6158C实现4路AHD摄像头BT1120接入与同步预览

本文详细解析了基于RK3588处理器与NVP6158C解码芯片实现4路AHD摄像头BT1120接入与同步预览的技术方案。针对车载环视和安防监控场景,重点探讨了硬件架构设计、BT1120接口配置、多路同步机制及Android HAL适配等核心问题,提供了从底层驱动到上层应用的完整实现路径,为相关领域的工程实践提供可靠参考。

weixin_30571465的博客 486

socket5代理简单使用

socket是什么 有两个程序,通过一个双向的通信连接实现数据交换,这个连接的一端就是一个soccet,也叫【套接字】;socket包括IP+端口,一个连接至少需要两个socket,因为连接的一端就是一个socket。 一个应用程序通过一个socket和其他应用程序建立连接; socket用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Intern...

JOJOY的博客 3万+

【26美赛D题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

2026美赛D题数学建模竞赛思路解析摘要:本文针对美赛D题提供系统性解决方案,提出四层建模框架(数据层、机理层、模型层、决策层),强调逻辑闭环比模型复杂度更重要。包含通用建模步骤:指标体系构建、状态评估、动态预测和策略优化,并给出Python基础代码框架。论文建议采用七段式结构,突出从现实问题到决策方案的完整闭环。核心在于通过数据驱动方法揭示问题规律,结合多源数据整合、系统行为建模和风险评估,最终形成可落地的决策建议,体现数学建模解决实际问题的能力。

一键难忘的博客 1083

UDP下的SOCK5代理实现

Author:zfive5(zhaozidong) Email :zfive5@yahoo.com.cn     前些时间,以前同事叫我帮忙写一个upd下的sock5代理,由于一些原因 没有帮成他的忙,我在这里再次对他说抱歉! 关于sock5代理的包文和数据 格式可以参考以下url中的内容:   http://www.vckbase.net/document/viewdoc/?id=85

ZFIVE5 1万+

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1218

为何wait和notify方法必须加锁?

为何wait和notify方法必须加锁? 是为了避免Lost Wake Up问题,即丢失唤醒问题。 所谓Lost Wake Up,指的是:线程A调用wait()方法进入阻塞状态,接下来没有其他线程去唤醒线程A,或者其他线程唤醒的时机不对(早于线程A的wait()),导致线程A永远阻塞下去。 下面以一个生产者和消费者的案例来说明上述问题。 假如我们有两个线程,一个消费者线程,一个生产者线程。生产者线程的任务可以简化成将count加一,而后唤醒消费者;消费者则是将count减一,而后在减到0的时候陷入睡眠,.

打酱油的葫芦娃 9155

SOCK5代理服务的设计与实现

对于服务器而言,SOCK5协议的流程可用四个步骤解释: 协商 > 验证 > 接收请求 > 转发数据 SOCK5在RFC1928及RFC1929中有详细说明,RFC1928描述了SOCK5的“协商、接收请求”,RFC1929描述了SOCK5的“验证”过程。 对于上面的四个步骤,可简要地概述如下(以客户端对过代理connect远程主机为例): 1、 在SOCK5的协商过程中,客户端向服

caschaoxin的专栏 2174

Unity引擎开发:复杂动作系统_动作捕捉数据的应用与整合

通过以上步骤,我们可以在Unity中有效地应用和整合动作捕捉数据,以实现更加真实和流畅的动画效果。从导入文件格式的选择,到预处理和优化,再到实时应用和调试验证,每一步都至关重要。希望本文能帮助你在Unity项目中更好地利用动作捕捉数据,提升动画质量和性能。

chenlz2007的博客 959

3proxy+nginx实现sock5爬虫代理

sock5实现单一代理入口,通过多IP随机出访,适用于各种爬虫、反防刷,节前最后一篇文章,废话少说,走起!!!软件下载cd/usr/local/src wget"http://3proxy.ru/0.7.1.1/3proxy-0.7.1.1.tgz" wget"http://nginx.org/download/nginx-1.4.4.tar.gz" wget"htt...

weixin_33871366的博客 1165

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

sock代理服务原理(TCP穿透)

原文转自:http://www.cppblog.com/zuhd/archive/2010/06/08/117366.htmlsock代理分为sock4代理和 sock5代理。sock4支持TCP(事实仅支持TCP),无需用户名、密码验证;sock5支持TCP和UDP,根据代理服务器设置是否需要用户名、密码认证。TCP和UDP代理工作原理产不多,UDP代理网上多的是,google一下即可。这里只讲T

WHACKW的专栏 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB.Net2010 下的sock5代理实现

文章转载自 【http://blog.youkuaiyun.com/wuxing1129/article/details/4514650】 Imports System.Net Imports System.Net.Sockets Imports System.Text Public Class SockProxy Private m_RequireAuthorize As Boolean

gboxtop的专栏 1668

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用sock5代理连接tcp

#ifndef EMS_PROXY_H #define EMS_PROXY_H #pragma once #include #include #include using namespace std; /* sock代理工作原理大致如下: 1。[需要代理方]向服务器发出请求信息; 2。[代理方]应答; 3。[需要代理方]接到应答后发送向[代理方]发

XiaoWhy的专栏 1万+

Java实现sock5代理服务器

入职练手socks5代理服务器,过程总结一下。 1.下载火狐浏览器,设定代理为socks5代理,地址为127.0.0.1:1080。 2.socks5协议1928,中文版,原版,认真阅读 3.按照协议通过Java开发代理服务器。 4.代码在git上,https://github.com/Neal6/SimpleSocketProxy.git 5.说明:简略版,认证方式是默认的无认证,日志...

weixin_30878361的博客 1770

sock5 UDP代理通信及dante-1.4.0 实现篇

1:数据通信框图 上面是数据的流向,是双向的。此处主要是PC的数据进过router设备,之后到达proxy server,由proxy server转发之后到达UDPserver端。特定PC(特定IP及port)的数据进行WLAN设备的sock5客服端处理,直接将数据发送给UDP server。其中对于PC来说不用做任何的处理(sock5相关的协议),在此router设备完成了与so

OpenWrt/WLAN/驱动/Android/嵌入式开发总结 1万+

socket穿透代理代码(C++版)

写代码经常会遇到socket要通过代理连接服务器的情况,代理类型通畅有三种:HTTP、SOCK4和SOCK5,通过学习和网上参考相关代码,写了个代理类来实现该功能,贴出来与大家共享 才贴出来两天,刚在百度一搜竟然发现已被一字不改的转载到好几个网站去了,连转载的字样都没有,不反对转载分享,可能否注明出处? 头文件 [cpp] view p

tongjing524的专栏 783

<转 >socket穿透代理代码(C++版)

本文转自 http://blog.youkuaiyun.com/bodybo/article/details/7274865 写代码经常会遇到socket要通过代理连接服务器的情况,代理类型通畅有三种:HTTP、SOCK4和SOCK5,通过学习和网上参考相关代码,写了个代理类来实现该功能,贴出来与大家共享   才贴出来两天,刚在百度一搜竟然发现已被一字不改的转载到好几个网站去了,连转载的字样都没有,不反...

weixin_34029680的博客 249

XShell配置Socket5代理

打开代理设置面板,点击:view -> Tunneling Pane 在弹出的窗口选择Forwarding Rules, 在空白处右键:add。在弹出的Forwarding Rule,Type选择“Dynamic(SOCK54/5”;Listen Port使用默认的1080。 这时浏览器就可以使用代理上网了。以FireFox为例,选项—高级—网络—设置—手动配置代理—Socks主机写127.0

十年磨一剑,霜刃未曾试! 7297
上一篇: 用DLL方式封装MDI子窗体。
下一篇: 用POWERDESIGNER生成ACCESS2000类型数据库文件
myan18
博客等级 码龄25年 15粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值