CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

自己写的Socks5代理的源码,还有些问题没有解决,请大家指教!(2)

楼主quharry(蓝叶)2005-01-03 17:55:07 在 Delphi / 网络通信/分布式开发 提问

要实现功能Http、Socks5(无验证)代理。  
  现出现如下问题,1、Http代理可用,但不能实现多线程。  
                                  2、Socks5代理IPV4可用,域名方式下载时不能获取文件大小,出现实况转播情况。  
  由于文件太大,分成了两张贴子!  
   
  =========================================================================================  
   
  procedure   TransLate(Sock:integer);  
      Function   SearchSubstr(Buf:array   of   Byte;Len:integer):Pchar;  
      var  
          Pstr,TarStr,PosStr,ResStr:Pchar;  
          url:string;  
          Pos1,Len1:integer;  
      begin  
          Pstr:=StrAlloc(Len+1);  
          Pstr:=StrLCopy(Pstr,PChar(@Buf[0]),Len);  
          TarStr:=StrPos(Pstr,#13#10+'Host:');  
          if   TarStr=Nil   then  
          begin  
              StrDispose(Pstr);  
              Result:=Nil;  
          end   else  
          begin  
              TarStr:=TarStr+8;  
              PosStr:=StrPos(TarStr,#13#10);  
              ResStr:=StrAlloc(PosStr-TarStr+1);  
              ResStr:=StrLCopy(ResStr,TarStr,PosStr-TarStr);  
              TarStr:=StrScan(ResStr,':');  
              if   TarStr<>Nil   then  
              begin  
                  Tarstr:=Tarstr+1;  
                  TarGetPort:=StrToInt(StrPas(TarStr));  
                  Result:=StrLCopy(ResStr,ResStr,TarStr-ResStr-1);  
                  url:='http://'+Result;  
                  if   TarGetPort<>80   then   url:=url+':'+inttostr(TarGetPort);  
                  Pos1:=Pos(url,Pchar(@Buf[0]));  
                  Len1:=Length(url);  
  //                 Delete(pchar(@buf[0]),Pos1,Len1);  
              end   else  
              begin  
                  Result:=ResStr;  
                  StrDispose(Pstr);  
              end;  
          end;  
      end;  
   
  var  
      Buf:array   of   Byte;  
      Len:integer;  
  begin  
      SetLength(Buf,MaxChangeLen);  
      Len:=recv(Sock,Buf[0],MaxChangeLen,0);  
      if   len<=0   then  
      begin  
          closesocket(sock);  
          setLength(Buf,0);  
          exit;  
      end;  
      TarGetPort:=DefaulthttpPort;  
      TarGethost:=SearChSubStr(Buf,Len);  
  //     ShowMessage(TarGetHost);  
      if   TarGethost=Nil   then  
      begin  
          CloseSocket(Sock);  
          SetLength(Buf,0);  
          Exit;  
      end;  
      SendBuf(Buf,Len,sock);  
      SetLength(Buf,0);  
  end;  
   
  procedure   THExeThread.Execute;  
  begin  
      TransLate(ClientSock);  
  end;  
   
  Destructor   THExeThread.Destroy;  
  begin  
      inherited   Destroy;  
  end;  
   
  end.  
   
  //======================Socks5   Proxy   监听线程=====================  
  unit   SLisThread;  
   
  interface  
   
  uses  
      classes,winsock,windows,SExeThread;  
   
  type  
      TSLisThread=Class(TThread)  
      private  
          SLisSocket:TSocket;  
          SLisPort:integer;  
      protected  
          procedure   Execute;override;  
      public  
          constructor   CreateSLisThread(Port:Integer);  
          Destructor   Destroy;override;  
      end;  
   
  implementation  
   
  uses   main;  
   
  constructor   TSLisThread.CreateSLisThread(Port:Integer);  
  begin  
      Inherited   create(True);  
      SLisPort:=Port;  
      FreeonTerminate:=True;  
      Resume;                                         //开始线程  
  end;  
   
  procedure   TSLisThread.Execute;  
  var  
      AcceptSocket:TSocket;  
      TempThread:TSExeThread;  
      sA:Sockaddr_in;  
      sALen:integer;  
      MyBuf:array[0..256]   of   Byte;  
      ReIP:string;  
  begin  
      SLisSocket:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP);  
      if   SLisSocket=INVALID_SOCKET   then   Exit;  
      sA.sin_family:=PF_INET;  
      sA.sin_port:=htons(SLisPort);  
      sA.sin_addr.S_addr:=INADDR_ANY;  
      sALen:=Sizeof(sA);  
      //绑定  
      if   bind(SLisSocket,sA,sALen)=SOCKET_ERROR   then  
      begin  
          closesocket(SLisSocket);  
          Exit;  
      end;  
      //开始监听  
      Listen(SLisSocket,5);  
      while   not   Terminated   do  
      begin  
          AcceptSocket:=accept(SLisSocket,@sA,@sALen);     //有客户端连接  
          GetPeerName(SLisSocket,sA,sALen);                           //获取客户端信息  
          ReIP:=inet_ntoa(sA.sin_addr);  
          if   ReIP='162.168.2.40'   then                                       //进行客户端IP过滤  
          begin  
              if   AcceptSocket=INVALID_SOCKET   then   Continue;  
              recv(AcceptSocket,mybuf,257,0);  
              if   mybuf[0]=$05   then  
              begin  
                  if   (mybuf[1]=$01)   and   (mybuf[2]=$00)   then  
                  begin  
                      mybuf[0]:=$05;mybuf[1]:=$00;  
                  end   else   begin  
                      mybuf[0]:=$05;mybuf[1]:=$FF;  
                  end;  
                  send(AcceptSocket,mybuf,2,0);  
                  TempThread:=TSExeThread.CreateExeThread(AcceptSocket);     //建立Socks5执行线程  
                  if   TempThread<>Nil   then   TempThread.resume   else   Closesocket(AcceptSocket);  
              end;  
          end   else   begin  
              Form1.Memo1.Lines.Add('非法客户端!,连接被拒绝!');  
  //             closesocket(AcceptSocket);  
          end;  
      end;  
      closesocket(SLisSocket);  
  end;  
   
  Destructor   TSLisThread.Destroy;  
  begin  
      if   SLisSocket<>   INVALID_SOCKET   then   closesocket(SLisSocket);  
      postmessage(form1.Handle,WM_SOCKTHREADDONMSG,self.ThreadID,0);       //向主线条发送自定义关闭消息  
      inherited   Destroy;  
  end;  
   
  end. 问题点数:0、回复次数:6Top

1 楼S.F.(chinasf.cnblogs.com)回复于 2005-01-03 19:21:19 得分 0

1楼Top

2 楼jackie168(http://soft.eastrise.net)回复于 2005-01-03 20:14:33 得分 0

2楼Top

3 楼quharry(蓝叶)回复于 2005-01-04 13:07:37 得分 0

大家帮帮忙吧!  
  高手都去哪儿啦?  
  自己顶一下!Top

4 楼Kevin_Lmx(繁华阅尽)回复于 2005-01-04 13:12:48 得分 0

MK,回头看看。  
  ^_^Top

5 楼Kshape(C/C++初学者~~~~)回复于 2005-01-05 13:53:04 得分 0

帮你顶Top

6 楼jim138()回复于 2005-01-05 14:07:07 得分 0

DING   :)))Top

相关问题

  • 找代理服务器的源码
  • 那位能给我一个代理服务器的源码
  • 求源码:socket透过代理服务器建立连接
  • 高分(500)求购代理服务器源码!要求C++!
  • socks代理的问题
  • JAVA写代理
  • 众位高手,请教:如何编写SOCKS 5代理服务器程序?
  • 代理服务器编程,如何实现socks代理!!!!
  • 如何通过http代理实现socks代理?
  • wingate如何实现2重socks代理?

关键词

  • tarstr
  • resstr
  • posstr
  • slissocket
  • targetport
  • pstr
  • strlcopy
  • 代理
  • sock
  • closesocket

得分解答快速导航

  • 帖主:quharry

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo