各位大虾,小弟是新手,想写一个Socks5代理服务器程序,不知道谁这方面的资料,
有源码最好!
谢谢!

解决方案 »

  1.   

    unit main;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls, ScktComp, TrayIcon, Menus, StdCtrls;typesession_record=recordUsed: boolean; {会话记录是否可用}SS_Handle: integer; {代理服务器套接字句柄}CSocket: TClientSocket; {用于连接远程的套接字}Lookingup: boolean; {是否正在查找服务器}LookupTime: integer; {查找服务器时间}Request: boolean; {是否有请求}request_str: string; {请求数据块}client_connected: boolean; {客户机联机标志}remote_connected: boolean; {远程服务器连接标志}end;typeTForm1 = class(TForm)ServerSocket1: TServerSocket;ClientSocket1: TClientSocket;Timer2: TTimer;TrayIcon1: TTrayIcon;PopupMenu1: TPopupMenu;N11: TMenuItem;N21: TMenuItem;N1: TMenuItem;N01: TMenuItem;Memo1: TMemo;Edit1: TEdit;Label1: TLabel;Timer1: TTimer;procedure Timer2Timer(Sender: TObject);procedure N11Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure N21Click(Sender: TObject);procedure N01Click(Sender: TObject);procedure ServerSocket1ClientConnect(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocket1ClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocket1ClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);procedure ClientSocket1Write(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);procedure ServerSocket1Listen(Sender: TObject;Socket: TCustomWinSocket);procedure AppException(Sender: TObject; E: Exception);procedure Timer1Timer(Sender: TObject);private{ Private declarations }publicService_Enabled: boolean; {代理服务是否开启}session: array of session_record; {会话数组}sessions: integer; {会话数}LookUpTimeOut: integer; {连接超时值}InvalidRequests: integer; {无效请求数}end;varForm1: TForm1;implementation{$R *.DFM}//系统启动定时器,启动窗显示完成后,缩小到System Tray…procedure TForm1.Timer2Timer(Sender: TObject);begintimer2.Enabled:=false; {关闭定时器}sessions:=0; {会话数=0}Application.OnException := AppException; {为了屏蔽代理服务器出现的异常}invalidRequests:=0; {0错误}LookUpTimeOut:=60000; {超时值=1分钟}timer1.Enabled:=true; {打开定时器}n11.Enabled:=false; {开启服务菜单项失效}n21.Enabled:=true; {关闭服务菜单项有效}serversocket1.Port:=988; {代理服务器端口=988}serversocket1.Active:=true; {开启服务}form1.hide; {隐藏界面,缩小到System Tray上}end;
      

  2.   

    //开启服务菜单项…procedure TForm1.N11Click(Sender: TObject);beginserversocket1.Active:=true; {开启服务}end; //停止服务菜单项…procedure TForm1.N21Click(Sender: TObject);beginserversocket1.Active:=false; {停止服务}N11.Enabled:=True;N21.Enabled:=False;Service_Enabled:=false; {标志清零}end; //主窗口建立…procedure TForm1.FormCreate(Sender: TObject);beginService_Enabled:=false;timer2.Enabled:=true; {窗口建立时,打开定时器}end;//窗口关闭时…procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begintimer1.Enabled:=false; {关闭定时器}if Service_Enabled thenserversocket1.Active:=false; {退出程序时关闭服务}end;//退出程序按钮…procedure TForm1.N01Click(Sender: TObject);beginform1.Close; {退出程序}end;//开启代理服务后…procedure TForm1.ServerSocket1Listen(Sender: TObject;Socket: TCustomWinSocket);beginService_Enabled:=true; {置正在服务标志}N11.Enabled:=false;N21.Enabled:=true;end;//被代理端连接到代理服务器后,建立一个会话,并与套接字绑定…procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;Socket: TCustomWinSocket);vari,j: integer;beginj:=-1;for i:=1 to sessions do {查找是否有空白项}if not session[i-1].Used and not session[i-1].CSocket.active thenbeginj:=i-1; {有,分配它}session[j].Used:=true; {置为在用}break;endelseif not session[i-1].Used and session[i-1].CSocket.active thensession[i-1].CSocket.active:=false;if j=-1 thenbegin {无,新增一个}j:=sessions;inc(sessions);setlength(session,sessions);session[j].Used:=true; {置为在用}session[j].CSocket:=TClientSocket.Create(nil);session[j].CSocket.OnConnect:=ClientSocket1Connect;session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;session[j].CSocket.OnError:=ClientSocket1Error;session[j].CSocket.OnRead:=ClientSocket1Read;session[j].CSocket.OnWrite:=ClientSocket1Write;session[j].Lookingup:=false;end;session[j].SS_Handle:=socket.socketHandle; {保存句柄,实现绑定}session[j].Request:=false; {无请求}session[j].client_connected:=true; {客户机已连接}session[j].remote_connected:=false; {远程未连接}edit1.text:=inttostr(sessions);end;//被代理端断开时…procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);vari,j,k: integer;beginfor i:=1 to sessions doif (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used thenbeginsession[i-1].client_connected:=false; {客户机未连接}if session[i-1].remote_connected thensession[i-1].CSocket.active:=false {假如远程尚连接,断开它}elsesession[i-1].Used:=false; {假如两者都断开,则置释放资源标志}break;end;j:=sessions;k:=0;for i:=1 to j do {统计会话数组尾部有几个未用项}beginif session[j-i].Used thenbreak;inc(k);end;if k>0 then {修正会话数组,释放尾部未用项}beginsessions:=sessions-k;setlength(session,sessions);end;edit1.text:=inttostr(sessions);end;//通信错误出现时…procedure TForm1.ServerSocket1ClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);vari,j,k: integer;beginfor i:=1 to sessions doif (session[i-1].SS_Handle=socket.SocketHandle) and session[i-1].Used thenbeginsession[i-1].client_connected:=false; {客户机未连接}if session[i-1].remote_connected thensession[i-1].CSocket.active:=false {假如远程尚连接,断开它}elsesession[i-1].Used:=false; {假如两者都断开,则置释放资源标志}break;end;j:=sessions;k:=0;for i:=1 to j dobeginif session[j-i].Used thenbreak;inc(k);end;if k>0 thenbeginsessions:=sessions-k;setlength(session,sessions);end;edit1.text:=inttostr(sessions);errorcode:=0;end;//被代理端发送来页面请求时…procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);vartmp,line,host: string;i,j,port: integer;beginfor i:=1 to sessions do {判断是哪一个会话}if session[i-1].Used and (session[i-1].SS_Handle=socket.sockethandle) thenbeginsession[i-1].request_str:=socket.ReceiveText; {保存请求数据}tmp:=session[i-1].request_str; {存放到临时变量}memo1.lines.add(tmp);j:=pos(char(13)+char(10),tmp); {一行标志}while j>0 do {逐行扫描请求文本,查找主机地址}beginline:=copy(tmp,1,j-1); {取一行}delete(tmp,1,j+1); {删除一行}j:=pos('Host',line); {主机地址标志}if j>0 thenbegindelete(line,1,j+5); {删除前面的无效字符}j:=pos(':',line);if j>0 thenbeginhost:=copy(line,1,j-1);delete(line,1,j);tryport:=strtoint(line);exceptport:=80;end;endelsebeginhost:=trim(line); {获取主机地址}port:=80;end;
      

  3.   

    if not session[i-1].remote_connected then {假如远征尚未连接}beginsession[i-1].Request:=true; {置请求数据就绪标志}session[i-1].CSocket.host:=host; {设置远程主机地址}session[i-1].CSocket.port:=port; {设置端口}session[i-1].CSocket.active:=true; {连接远程主机}session[i-1].Lookingup:=true; {置标志}session[i-1].LookupTime:=0; {从0开始计时}endelse{假如远程已连接,直接发送请求}session[i-1].CSocket.socket.sendtext(session[i-1].request_str);break; {停止扫描请求文本}end;j:=pos(char(13)+char(10),tmp); {指向下一行}end;break; {停止循环}end;end;//当连接远程主机成功时…procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);vari: integer;beginfor i:=1 to sessions doif (session[i-1].CSocket.socket.sockethandle=socket.SocketHandle) and session[i-1].Used thenbeginsession[i-1].CSocket.tag:=socket.SocketHandle;session[i-1].remote_connected:=true; {置远程主机已连通标志}session[i-1].Lookingup:=false; {清标志}break;end;end; //当远程主机断开时…procedure TForm1.ClientSocket1Disconnect(Sender: TObject;Socket: TCustomWinSocket);vari,j,k: integer;beginfor i:=1 to sessions doif (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used thenbeginsession[i-1].remote_connected:=false; {置为未连接}if not session[i-1].client_connected thensession[i-1].Used:=false {假如客户机已断开,则置释放资源标志}elsefor k:=1 to serversocket1.Socket.ActiveConnections doif (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used thenbeginserversocket1.Socket.Connections[k-1].Close;break;end;break;end;j:=sessions;k:=0;for i:=1 to j dobeginif session[j-i].Used thenbreak;inc(k);end;if k>0 then {修正会话数组}beginsessions:=sessions-k;setlength(session,sessions);end;edit1.text:=inttostr(sessions);end;//当与远程主机通信发生错误时…procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);vari,j,k: integer;beginfor i:=1 to sessions doif (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used thenbeginsocket.close;session[i-1].remote_connected:=false; {置为未连接}if not session[i-1].client_connected thensession[i-1].Used:=false {假如客户机已断开,则置释放资源标志}elsefor k:=1 to serversocket1.Socket.ActiveConnections doif (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) and session[i-1].used thenbeginserversocket1.Socket.Connections[k-1].Close;break;end;break;end;j:=sessions;k:=0;for i:=1 to j dobeginif session[j-i].Used thenbreak;inc(k);end;errorcode:=0;if k>0 then {修正会话数组}beginsessions:=sessions-k;setlength(session,sessions);end;edit1.text:=inttostr(sessions);end;//向远程主机发送页面请求…procedure TForm1.ClientSocket1Write(Sender: TObject;Socket: TCustomWinSocket);vari: integer;beginfor i:=1 to sessions doif (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used thenbeginif session[i-1].Request thenbeginsocket.SendText(session[i-1].request_str); {假如有请求,发送}session[i-1].Request:=false; {清标志}end;break;end;end;//远程主机发来页面数据时…procedure TForm1.ClientSocket1Read(Sender: TObject;Socket: TCustomWinSocket);vari,j: integer;rec_bytes: integer; {传回的数据块长度}rec_Buffer: array[0..2047] of char; {传回的数据块缓冲区}beginfor i:=1 to sessions doif (session[i-1].CSocket.tag=socket.SocketHandle) and session[i-1].Used thenbeginrec_bytes:=socket.ReceiveBuf(rec_buffer,2048); {接收数据}for j:=1 to serversocket1.Socket.ActiveConnections doif serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle thenbeginserversocket1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes); {发送数据}break;end;break;end;end;//“页面找不到”等错误信息出现时…procedure TForm1.AppException(Sender: TObject; E: Exception);begininc(invalidrequests);end;//查找远程主机定时…procedure TForm1.Timer1Timer(Sender: TObject);vari,j: integer;beginfor i:=1 to sessions doif session[i-1].Used and session[i-1].Lookingup then {假如正在连接}begininc(session[i-1].LookupTime);if session[i-1].LookupTime>lookuptimeout then {假如超时}beginsession[i-1].Lookingup:=false;session[i-1].CSocket.active:=false; {停止查找}for j:=1 to serversocket1.Socket.ActiveConnections doif serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle thenbeginserversocket1.Socket.Connections[j-1].Close; {断开客户机}break;end;end;end;end;end.
      

  4.   

    to xiangwangz(<*敝屣荣华 浮云生死 此身何惧,
       首先向你表示感谢!
       你贴的那个代码我已经有了,它其实算不上真正意义上的Http代理服务器,最多属于一个网关类的程序,而且不能访问有网址重定向的网站,如:www.163.com和雅虎等。
    不知谁有Socks5代理的源代码可以奉献? :)
      

  5.   

    socks5握手协议部份已经完成,但是后面的工作不知怎么做了!
    比如下载软件通过此代理下载http://www.123.com/XXX.rar,
    那么下载软件发送到Socks代理的数据是什么样子的呢???
    希望大家赐教!
    小弟跪拜啦!