请教:两台使用局域网上网的机器如何才能建立连接?(200分)

  • 主题发起人 主题发起人 Traveller
  • 开始时间 开始时间
好像Sock 4/Sock 5协议可以做到,但是具体怎么用呢?
我想至少需要用到下列信息:
被连接方:
防火墙IP
局域网IP/帐户名或机器名

请求连接方:
防火墙IP

其实QQ也支持位于两个局域网内的用户聊天啊。
 
使用VPN进行连接,但必须有一方作为接受服务方,并由接受方的服务器为你自动分配一个IP地址或指定一个该网段的IP。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1078770

来自:sonicyou, 时间:2002-5-2 2:23:00, ID:1080111
问题很好解决,用Nmudp,我做icq的时候,这样实现的:
DataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String; Port: Integer);
var ……
begin
……
Stream:=TMemoryStream.Create;
Nmudp.ReadStream(MyStream);
……
ip:=FromIP;
然后发回获取的IP和Port
Port是随时变化的
你可以测试一下,没问题的
给分吧



来自:Sunny18, 时间:2002-5-2 5:26:00, ID:1080131
我来说说看:
OICQ之间的通迅应该是这样的,当你登录时,会QQ服务器提供你当前所在的IP地址各端口
号,然后当你的好友上线时,就会从QQ服务得到这个IP和Port,以后的通迅才能继续!
上面可能没说得太清楚,下面举个例子来解释,
比如说,你在一家网吧里上网,这个网吧的服器有一个真正的IP地址(可能是临时的--对于
拨号上网;或者是固定的--对于专线上网)比如是61.168.45.120,同时有一个网吧局域网
的IP地址,比如192.168.0.1。而你在该网吧内IP地址为192.168.0.3的机器上用OICQ,当你
上线时,QQ会按你设定的路由发送数据(对于网吧,一般是设IP为192.168.0.3的机器的默
认网关为网吧的服务器,即192.168.0.1的机器)把你所在机器的IP(192.168.0.3)和Port
(一般第一个QQ为4000,二个为4001,依次类推,这时设为4000)通知网吧服器,由于网吧
的服务器(也可说是一个网关)要同时满足多台机器上网的需要,会在它的局域网地址(
即192.168.0.1上)动态的分配一个Port(如 4782)与你通迅,同时再在真正的IP(
即61.168.45.120)上分配一个Port(比如 5472)将你的数据发送到互联网上,这里即为向
QQ服务器发出它的IP和Port(这些都是在网吧服务器上运行的一个代理软件 如WinGate、
SyGate等 所做操作)。
{注意:这个发出的IP是网吧服务器的那个真正IP,Port为相对于这个IP的一个端口(5472)}
现在QQ服务器就把你的QQ当着是在IP为61.168.45.120的机器的Port 5472上运行了,当你的
好友上线时,它就会得到这个IP和Port,然后和你通迅,即把所有发给你的数据都发到
IP为61.168.45.120的机器的5472 Port上,然后网吧服务器上所装的代理软件(比如
WinGate、SyGate等)就会把这些数据通过局域网地址(IP:192.168.0.1,Port:4782)转发到
你所在的机器(192.168.0.3)的相应Port(4000)上,即完成通迅。
其实这中间主要有两个方面 一、就是网吧服务器中的代理,它负则对局域到互联网、互联
网到局域网的数据进行转发。第二,也是关键的一点就是QQ每次上线时会向QQ服务器注册自
己所在的IP和Port,并从QQ服务器中读出在线好友所在的IP和Port信息而进行通讯。当然处
于局域网时这些操作又都是通过网吧服务器中的代理完成的。
以上是我个人的一些见解,如有不对之处,还望各位行家里手多多指点、共同研究进步。



 
谢谢xaiman提供连接,我已经向sunny18发出了邀请,我想进一步讨论一下,欢迎大家继续关注本问题。
 
但是有些信息能通过,有些信息却无法通过。如微软的MSN在网关后面就无法使用,难道微软无此项技术。
 
知道IP也不行呀还根Port,而Port一般是上网是网关服务器动态分的,你怎么得到。
如果不想用单独的服务器,可以把服务功能写到你知道IP地址的机器上,也服是把这台
机器当作服务器来用。
个人观点,多谢指正!
 
sunny,你的意思是不是说局域网中的用户对外的唯一标识不是仅仅IP,而是IP+Port?只要知道了对方的IP+Port就可以和他建立连接了?如果真是这样的话我基本明白了。
 
在你的局域网服务器中安装你自己写的一个服务程序,在其它局域网中同样
安装一个这样的服务程序,然后各客户端通过这两个中介进行通讯.....
 
以下是本人的分析和理解。

我觉得其实应该是这么一个过程,首先制作一个服务器端的程序,然后做一个客户端的程序
,以DUP形式进行连接,这样服务器端可以获得客户端的IP和PORT,因为DUP协议是端口绑定
式的通信,所以可以用这个获取的端口反向操作,以和客户端相连接。也就是说服务器端得
到IP和PORT,然后用这个IP和PORT就可以连接客户端了。当然,在刚开始的时候因为不知道
客户端的IP和PORT,所以无法用服务器直接相连接。

如果是上面的原理的话,就可以自己做一个服务来进行IP和PORT的连接调度,以解决通讯问
题。欢迎指正。[:D]
 
DUP是什么协议?能详细的解释一下吗?或者给个连接。
另外,如果是这样的话,那么只要知道对方局域网的IP,岂不是就可以通过逐一尝试端口的方式来连接局域网内的任意一台机器了?
 
不好意思,我写错了一个东西,是UDP协议,^_^

好像叫无连接协议,我最近正在做这个试验,如果成功了,和大家分享。^_^
 
好,等你的好消息 :D
 
A(局部网电脑)--->B(主机)--->INTENET
C(局部网电脑)--->D(主机)--->INTENET
A与C直接通信,只能用UDP协议
SOCKET5一样需要代理服务器的吧.
在B或者D安装一个代理的话就失去了它的意义了:跟用代理服务器有什么区别?

那么,A如何与C直接通信呢?其实只要知道D的IP地址即可.
原理:A不断ping一个网址,比如说163.com.这样一来在B会打开一个端口的.但是打开的时间
是很短的关键处理这里即可.因为网关,B会把数据转发到A的.
全部代码测试.通过主要用于传送数据.Delphi5写的.
 
一帮人在这里不知所云
建议每人去买本"tcp/ip 原理傻瓜书“
再买本"局域网结构原理傻瓜书"
买书的钱要比你的上网费便宜的多。
如果不用服务器能建立连接,入侵内网就太容易了。
 
to jingtao:
->A不断ping一个网址,比如说163.com.这样一来在B会打开一个端口的.但是打开的时间
->是很短的关键处理这里即可
可否将这处代码发送上来让大家学习?
 
要使用代理服务器的话是行不通的。
UDP的话是否会影响连接的安全性?
也想知道Jingtao的做法
 
xaiman,很感谢您的分析,但从我日常使用OICQ的情况来看,和您的理解可能有些不同之处。
我们单位的服务器对外是限制了端口的,只开放80端口,通过MS Proxy2.0 供20多台局域网
计算机上网,通过设置Proxy 局域网内可正常使用OICQ。
对于OICQ发出的信息,我同意您的观点,由服务器动态分配一个端口发送信息,那么从对方
的OICQ发来的信息不知是哪个端口传递的。安理说除了80号端口其他是不开放的。
还有就是UDP是无连接的协议,每次经过网吧的代理,都可能随机分配一个端口出去,代理
服务器是如何保留每个OICQ的不同端口的。
我最近也在写类似OICQ的小程序,碰到此问题,希望大家共同讨论。
 
看大家讨论的这么激烈,我也忍不住来插两句。

我的想法没有什么新意,我觉得QQ的对外网通信方式,应该就是IP+端口,
按照我的理解,我想应该在内网中的QQ,应该就象是在同一台机器上开了
很多个QQ,每个QQ都可以正常工作,我想这点可以证实“IP+端口”的说法,
至于说对内网QQ腾迅又加了什么特殊的手段,我觉得应该没有。

象普通的QQ,发送信息,我猜想格式应该是这样,
IP + 端口 + 信息内容及其它
只不过这个端口默认是8000罢了。

而内网或者同台机上的其它QQ应该格式也是一样,不过就是端口号是随机分配
而已。回复信息是就是按照IP加端口号为地址的。



 
有一个问题啊:如果内网用户A开了一个UDP服务器,端口假设为4444,那么,
他的主机B为什么会专门映射一个端口给他?难道A向B提出申请了?如果这样,
那外网用户不是很容易就可以接触内网机器了?UDP是这样,那么TCP连接也
有这个问题,打个比方,A开了一个ftp服务器,那么,B是不可能专门给这个
服务器映射一个端口给他的,否则,外网也可以访问这个Ftp服务器了,而我
们知道,在一般情况下,这是不可能的。好像有专门的端口映射软件,但是
我想这不是这个话题讨论的情况吧。
 
后退
顶部