tunnel |
尚未結案
|
KFC
一般會員 發表:43 回覆:73 積分:23 註冊:2003-03-27 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
供参考! 该程序的原理如下:你的客户端程序(发送数据)------>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 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
这个例子是这样的:比如说你在局域网内的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 發送簡訊給我 |
请问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 發送簡訊給我 |
请问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 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
KFC
一般會員 發表:43 回覆:73 積分:23 註冊:2003-03-27 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |