線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1453
推到 Plurk!
推到 Facebook!

tunnel

尚未結案
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-21 02:33:47 IP:210.77.xxx.xxx 未訂閱
我有一个不支持proxy的邮件收发程序。我想写一个类似sockscap的程序,将所有由该邮件程序发出的包都由我的sockscap发至远端的socks proxy再发出。请问怎样实现?
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-10 18:40:12 IP:61.155.xxx.xxx 未訂閱
供参考!    该程序的原理如下:你的客户端程序(发送数据)------>Socket5代理服务器(中转数据)----->远程目的主机(显示数据).所以你必须拥有一个Socket5代理服务器软件,强烈推荐朱尧坤先生写的CCproxy,下载地址http://www.youngzsoft.com/.     新建一个工程,放上四个Label,五个Edit,一个ServerSock控件,一个按钮和一个Memo控件.在uses里添加Winsock.窗口初始化的时候初始化各个控件. procedure TForm1.FormCreate(Sender: TObject); var TempWSAData:TWSAData; begin Label1.Caption:='Socks5代理服务器地址'; Edit1.Text:='127.0.0.1'; Label2.Caption:='Socks5代理服务器端口'; Edit2.Text:='1080'; Label3.Caption:='远程服务器地址'; Edit3.Text:='127.0.0.1'; Label4.Caption:='远程服务器端口'; Edit4.Text:='9999'; Edit5.Text:='输入要发送的字符'; Button1.Caption:='测试'; ServerSocket1.Port:=9999; ServerSocket1.Active:=True; Memo1.Lines.Clear; //初始化Winsock if (WSAStartup(MAKEWORD(2,0),TempWSAData)<>0) then begin Application.MessageBox('程序初始化失败!',Pchar(Application.Title),MB_ICONINFORMATION); Application.Terminate; end else Memo1.Lines.Add('程序初始化成功!'); end;     点Button1的时候通过代理服务器发送数据 procedure TForm1.Button1Click(Sender: TObject); var MyClientSock:TSocket; Socket5Proxy:TSockAddr; TargetSock:TSockAddr; MySocketBuf:array[0..256]of byte; SendStrBuf:array[0..1024*16] of char; PcharSocketAddr:PChar; Re,i:integer; begin Memo1.Lines.Add('----------------------------'); //1:创建Socket MyClientSock:=socket(AF_INET,SOCK_STREAM,0); if(MyClientSock=INVALID_SOCKET) then begin Memo1.Lines.Add('创建Socket失败!'); Exit; end else Memo1.Lines.Add('成功创建socket.'); //2:连接Socket5代理服务器 ZeroMemory(@Socket5Proxy,sizeof(Socket5Proxy)); Socket5Proxy.sin_family := AF_INET; GetMem(PcharSocketAddr,Length(Edit1.Text)+1); ZeroMemory(PcharSocketAddr,Length(Edit1.Text)+1); StrPCopy(PcharSocketAddr,Edit1.Text); Socket5Proxy.sin_addr.S_addr :=inet_addr(PcharSocketAddr); FreeMem(PcharSocketAddr); Socket5Proxy.sin_port := htons(StrToInt(Edit2.Text)); Re:=connect(MyClientSock,Socket5Proxy,sizeof(Socket5Proxy)); if Re = SOCKET_ERROR then begin Memo1.Lines.Add('连接代理服务器错误.错误代码:'+IntToStr(WSAGetLastError())); closesocket(MyClientSock); Exit; end else Memo1.Lines.Add('连接代理服务器成功!'); //3:Socket5协议验证与协商 MySocketBuf[0] := $05; MySocketBuf[1] := $01;MySocketBuf[2] := $00; re := send(MyClientSock, MySocketBuf, 3, 0);//发送格式化消息 if re=-1 then begin Memo1.Lines.Add('该服务器不支持Socket5代理!'); closesocket(MyClientSock); Exit; end; re:=recv(MyClientSock,MySocketBuf,257,0); //接收返回结果 if re<2 then begin Memo1.Lines.Add('该服务器不支持Socket5代理!'); closesocket(MyClientSock); Exit; end; if MySocketBuf[1]<>$00 then begin Memo1.Lines.Add('该服务器需要身份验证!'); closesocket(MyClientSock); Exit; end; Memo1.Lines.Add('与Socket5代理服务器协商成功!'); //4:发送远程主机信息并连接 ZeroMemory(@TargetSock,Sizeof(TargetSock)); Getmem(PcharSocketAddr,length(edit3.text) 1); ZeroMemory(PcharSocketAddr,length(edit3.text) 1); StrPcopy(PcharSocketAddr,edit3.text); TargetSock.sin_addr.s_addr := inet_addr(PcharSocketAddr); TargetSock.sin_port := htons(strtoint(edit4.text)); TargetSock.sin_family := AF_INET; MySocketBuf[0] := $05;MySocketBuf[1] := $01; MySocketBuf[2] :=$00; MySocketBuf[3] := $01; CopyMemory(@MySocketBuf[4],@TargetSock.sin_addr,4); CopyMemory(@MySocketBuf[8],@TargetSock.sin_port,2); re:=send(MyClientSock,MySocketBuf,10,0); if re=-1 then begin Memo1.Lines.Add('发送远程主机信息失败!'); closesocket(MyClientSock); Exit; end; re :=recv(MyClientSock,MySocketBuf,1024,0); if re=-1 then begin Memo1.Lines.Add('接收返回信息失败!'); closesocket(MyClientSock); Exit; end; if MySocketBuf[1]<>$00 then begin Memo1.Lines.Add('连接远程主机失败!'); closesocket(MyClientSock); Exit; end; Memo1.Lines.Add('连接远程主机成功!'); //5:发送数据 for i:=0 to Length(Edit5.Text)-1 do SendStrBuf[i]:=Edit5.Text[i 1]; re:=send(MyClientSock,SendStrBuf,Strlen(SendStrBuf),0); if re=-1 then begin Memo1.Lines.Add('发送数据到远程主机失败!'); closesocket(MyClientSock); Exit; end else Memo1.Lines.Add('发送数据到远程主机成功!'); //6:关闭Socket Memo1.Lines.Add('关闭Socket!'); Memo1.Lines.Add('----------------------------'); closesocket(MyClientSock); end; 放上一个ServerSocket控件是用来接收信息并显示出来的. procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var TempStr:String; begin TempStr:=Socket.ReceiveText; Application.MessageBox(Pchar(TempStr),'接收信息',0); end; 程序退出的时候要做一些工作. procedure TForm1.FormDestroy(Sender: TObject); begin WSACleanUP();//Winsocket释构 end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-10 18:57:46 IP:210.77.xxx.xxx 未訂閱
我看不懂这里的 'Socks5代理服务器地址' '远程服务器地址' 各代表什么。这个范例不太好,两个都用了本机地址。
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-11 08:24:52 IP:61.155.xxx.xxx 未訂閱
这个例子是这样的:比如说你在局域网内的IP地址为192.168.0.110 你连接入INTENET的主机动态IP地址为202.98.26.174 那么你先在主机运行代理程序,并在Edit1填上你的IP地址192.168.0.110    对方将数据发送到主机202.98.26.74端口6660,主机再将数据转发到你的电脑。 该程序代码如下: 外网主机(任意)-》代理服务器202.98.26.174-》内网主机edit1.text:='172.168.0.110';反之依然;    unit Unit1;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, NMUDP;    type   TForm1 = class(TForm)     NMUDP1: TNMUDP;     Edit1: TEdit;     Label2: TLabel;     procedure FormCreate(Sender: TObject);     procedure Edit1Change(Sender: TObject);     procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;       FromIP: String; Port: Integer);   private     { Private declarations }   public     { Public declarations }   end;      const MaxPackets=160; var   Form1: TForm1;    PacketLen,PlayPackets:integer; ok:integer=0; mPackets:integer=1; sPackets:integer=1; MBuffer:array[1..160,1..2000] of char; //8 Seconds    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject); begin NMUDP1.ReportLevel := Status_Basic; NMUDP1.LocalPort := 6660;//本地监听端口 NMUDP1.RemotePort := 6661;//远程接收数据端口 PlayPackets:=0; end;    procedure TForm1.Edit1Change(Sender: TObject); begin NMUDP1.Remotehost:=edit1.text;//远程主机的IP地址(比如:192.168.0.110) end;    procedure TForm1.NMUDP1DataReceived(Sender: TComponent;   NumberBytes: Integer; FromIP: String; Port: Integer); var mdata:array[1..2000] of char; k:integer; begin PacketLen:=NumberBytes; NMUDP1.ReadBuffer(mdata,NumberBytes);//接收数据 for k:=1 to NumberBytes do MBuffer[mPackets mod MaxPackets+1][k]:=mdata[k];    label2.caption:='Packets:'+inttostr(mPackets); inc(mPackets); NMUDP1.SendBuffer(mdata,NumberBytes);//将数据发送到目的主机    end;    end.    风花雪月 e梦情缘
------
风花雪月 e梦情缘
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-11 20:31:45 IP:210.77.xxx.xxx 未訂閱
请问MNUDP是什么?我在D7中怎么就找不到? 另外,我还是不太明白。第二个程序跟第一个的功能是否一样?为什么第二个程序那么短?例如我要向smtp.freemail.com:25发信,其中要经过远程的代理203.93.167.254:1080。请问是否要这样设? NMUDP1.LocalPort := 25; //本地监听端口 NMUDP1.RemotePort := 1080; //远程接收数据端口 NMUDP1.Remotehost:= 203.93.167.254; 如果果倒过来要通过代理203.93.167.254:1080向pop3.freemail.com:110收信呢,又该怎样设?谢谢
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-12 08:18:10 IP:61.155.xxx.xxx 未訂閱
请问MNUDP是什么?我在D7中怎么就找不到? 另外,我还是不太明白。第二个程序跟第一个的功能是否一样?为什么第二个程序那么短?例如我要向smtp.freemail.com:25发信,其中要经过远程的代理203.93.167.254:1080。请问是否要这样设? NMUDP1.LocalPort := 25; //本地监听端口 NMUDP1.RemotePort := 1080; //远程接收数据端口 NMUDP1.Remotehost:= 203.93.167.254; 如果果倒过来要通过代理203.93.167.254:1080向pop3.freemail.com:110收信呢,又该怎样设?谢谢 -------------------------------------------------------    我用得是D6,D7可能是IdUDPClient吧! 第一个程序与第二个程序功能基本相同,但第一个更完善! NMUDP1.LocalPort := 1080; //本地监听端口 NMUDP1.RemotePort := 110; //远程接收数据端口 NMUDP1.Remotehost:= pop3.freemail.com;    PC--->203.93.167.254:1080(PROXY)--->pop3.freemail.com:110        风花雪月 e梦情缘
------
风花雪月 e梦情缘
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-12 17:06:13 IP:210.77.xxx.xxx 未訂閱
还是不行。IdUDPClient跟NMUDP好像不是一回事。
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-13 08:35:06 IP:61.155.xxx.xxx 未訂閱
我一直在用D6,对D7部分控件不太了解。 你在D7中可能用INDY SERVERS->IdTunnelMaster控件吧!    风花雪月 e梦情缘
------
风花雪月 e梦情缘
KFC
一般會員


發表:43
回覆:73
積分:23
註冊:2003-03-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-13 13:05:36 IP:210.77.xxx.xxx 未訂閱
INDY好难用。看到DEMO中,IdUDPClient好不是单独用的。IdTunnelMaster要跟IdTunnelSlave一起用。好象都不太相干。 请问NMUDP是D6自带的,还是另外下载的?
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-13 14:15:33 IP:61.155.xxx.xxx 未訂閱
NMUDP是D6自带的.    风花雪月 e梦情缘
------
风花雪月 e梦情缘
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-04-26 13:52:45 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-04-19 1:37:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!