寻找网络编程高手:端口映射问题

aqaqa11 2002-09-19 11:30:48
比如:甲机有公网IP地址:61.112.22.32
乙机有公网IP地址:61.133.212.217
丙机只有内网IP地址:192.168.0.1 丙机通过乙机的代理服务可以访问外网
丁机有公网IP地址:61.182.122.132
问题:丁机想通过访问甲机的某一端口达到访问丙机某一端口的目的,而且只能设计在甲机和丙机上安装的软件,乙机上不装端口影射软件。用DELPHI如何编程实现?
...全文
160 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
del_c_sharp 2002-09-26
  • 打赏
  • 举报
回复
一个思路,考虑的不算成熟,但可以一try :
首先看代理是如何给你分配ip和端口的。
一般是通过内部ip映射为一个比较大的端口(包括adls也是这样)
比如你的代理服务器的公网ip为211。68。68。88 ,那么你被代理电脑的真实地址可就就象:211.68.68.88:33654

这样我们就可以测试了,首先作两个测试程序,一个是socket监听80端口(运行在有公网地址的一台主机上,比如拨号上网)
一个是socket发送到指定地址的80端口,指定localport=80(运行在被代理的电脑上),

被代理主机发送到数据到拨号主机(ip可知)的80端口,这样监听程序就可以知道被代理主机在公网上的端口号(例如上面的33654),那么我们就可以得到,被代理的localport==80 与 公网的33654成为http映射。

接下来,我们就可以在ie中:http://211.68.68.88:33654

IRCT 2002-09-25
  • 打赏
  • 举报
回复
没有见过
帮你up
lance09 2002-09-25
  • 打赏
  • 举报
回复
up,关注中..........
bluespy 2002-09-23
  • 打赏
  • 举报
回复
这是一个简单的c/s例子。看懂后改改就成

client:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, jpeg, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ClientSocket1: TClientSocket;
Button2: TButton;
Image1: TImage;
GroupBox1: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Bevel1: TBevel;
Button3: TButton;
Timer1: TTimer;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
GroupBox2: TGroupBox;
Button8: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
c:longint;
m:tmemorystream;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
try
clientsocket1.Close;
clientsocket1.Host:=edit1.text;
if length(edit2.Text) >0 then
clientsocket1.Port :=strtoint(edit2.text) else
clientsocket1.Port :=8787;
clientsocket1.Open; //连接服务端

except
showmessage(edit1.text+#10+'未开机或未安装服务程序');
end;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
form1.caption:='连接到'+edit1.text;
button2.Enabled :=true;
button3.Enabled :=true;
button4.Enabled :=true;
button5.Enabled :=true;
button6.Enabled :=true;
button7.Enabled :=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//ClientSocket1.Socket.SendText(Edit1.Text)
clientsocket1.Socket.SendText('gets'); //发送申请,通知服务端需要屏幕图象
end;

procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
form1.caption:='连接'+edit1.text+'.............';
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
caption:='连接'+edit1.text+'失败';
showmessage(edit1.text+' 未开机或未安装服务程序');
errorcode:=0;
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
buffer:array [0..10000] of byte; //设置接收缓冲区
len:integer;
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=socket.ReceiveText;
c:=strtoint(ll); //设置需接收的字节数
clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
end else
begin //以下为图象数据接收部分
len:=socket.ReceiveLength; //读出包长度
socket.ReceiveBuf(buffer,len); //接收数据包并读入缓冲区内
m.Write(buffer,len); //追加入流M中
if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
m.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中
b.Assign(j); //将JPG转为BMP
Image1.Picture.Bitmap.Assign(b); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
clientsocket1.Active:=false;
clientsocket1.Active:=true;
m.Clear;
c:=0;
end;
end;
end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
m:=tmemorystream.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m.free;
ClientSocket1.Close;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
tu.image1.Picture.Bitmap.Assign(image1.Picture.Bitmap );
tu.show;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
clientsocket1.Socket.SendText('gets');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
timer1.Enabled :=true;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('shutdown');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('reboot');
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('lock');
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('unlock');
end;

procedure TForm1.Button8Click(Sender: TObject);
var s:string;
i:integer;
begin
s:='';
for i:=0 to memo1.Lines.Count-1 do
begin
s:=s+memo1.Lines[i]+#13 ;
end;
clientsocket1.Socket.SendText(s);
end;

end.



server:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, jpeg, ExtCtrls, NMUDP,
StdCtrls ;

type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Image1: TImage;
Bevel1: TBevel;
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
m1:tmemorystream;

implementation

{$R *.dfm}
//声明在任务栏里隐藏函数 对windows2000失效
//function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord;
//stdcall; external 'KERNEL32.DLL';

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s,s1:string;
desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
begin
s:=socket.ReceiveText;
if s='gets' then //客户端发出申请
begin
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
desk:=tcanvas.Create; //以下代码为取得当前屏幕图象
desk.Handle:=getdc(hwnd_desktop);
m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)发送流后,
//它将保留到socket对话结束,
//不能用手工free掉,否则会触发异常
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
end;
jpg.Assign(bitmap); //将图象转成JPG格式
jpg.SaveToStream(m1); //将JPG图象写入流中
jpg.free;
m1.Position:=0;
s1:=inttostr(m1.size);
Socket.sendtext(s1); //发送图象大小
end;

if s='okok' then //客户端已准备好接收图象
begin
m1.Position:=0;
Socket.SendStream(m1); //发送JPG图象
end;

if s='shutdown' then ExitWindowsEx(EWX_SHUTDOWN,0); //关闭机器
if s='reboot' then ExitWindowsEx(EWX_REBOOT,0); //重新启动机器
if s='lock' then//如果是锁定机器指令
enablewindow(getdesktopwindow,false);
if s='unlock' then//如果是解除指令
enablewindow(getdesktopwindow,true);
if (s<>'unlock') and (s<>'lock') and (s<>'okok')
del_c_sharp 2002-09-23
  • 打赏
  • 举报
回复
你现在是什么地方不会呢?不明白你想问什么了.什么东西都交给甲转发就行了
aqaqa11 2002-09-23
  • 打赏
  • 举报
回复
bluespy()能否给个例子?
bluespy 2002-09-23
  • 打赏
  • 举报
回复
甲机和丙机都装上serversocket, 丁机clientsocket. 丁机发送给一个特定信息给甲机,甲的服务功能当个二传再另发一个特定信息给乙。端口可以配对指定。
aqaqa11 2002-09-23
  • 打赏
  • 举报
回复
难道没人愿意指点?
aqaqa11 2002-09-23
  • 打赏
  • 举报
回复
多谢bluespy() ,我的意思是通过外网(甲)的服务,访问内网(丙机)提供的WEB服务,能否详细一些?
wjlsmail 2002-09-22
  • 打赏
  • 举报
回复
study
猛禽 2002-09-22
  • 打赏
  • 举报
回复
我猜老兄是不想让乙知道丁访问过丙吧?是不是想干什么坏事?^_^
del_c_sharp 2002-09-21
  • 打赏
  • 举报
回复
和猛禽兄有同感,难道你想让甲做"替罪羊",不让丙知道丁层访问过它?
这当然可以实现,只要乙给丙足够的权限,就行了
halfdream 2002-09-21
  • 打赏
  • 举报
回复
在DELPHI里面有一个现成的例子。。
在indy的例子里面就有它。

aqaqa11 2002-09-21
  • 打赏
  • 举报
回复
尊敬的Raptor(猛禽) 先生,谢谢你的参与,请仔细研究我的问题,要实现的话需要在甲机和丙机上编写软件,建立映射通道,我用过这样的软件,现在想自己编写,故提出问题来请教。肯定可以实现的,不要怀疑!
请高手不吝赐教!
sncel 2002-09-19
  • 打赏
  • 举报
回复
不太好做,有点难度。
猛禽 2002-09-19
  • 打赏
  • 举报
回复
条件不全,甲乙丙是否在一个内网中?
aqaqa11 2002-09-19
  • 打赏
  • 举报
回复
高手难觅,还是不屑回答?
langer1 2002-09-19
  • 打赏
  • 举报
回复
NND,甲乙丙看花眼了
猛禽 2002-09-19
  • 打赏
  • 举报
回复
既然丙机在内网通过乙机到外网,丁机要访问丙机就非通过乙机不可,跟甲机没什么关系
aqaqa11 2002-09-19
  • 打赏
  • 举报
回复
甲、乙、丁都是在外网。丙在内网通过乙机的代理服务可以访问外网

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧