当前位置:主页>销售管理软件> 列表

我用idUDPServer组件如何实现两个局域网通信? 找医药进销存软件

财务软件版1楼: 我能idUDPServer组件,如何让两个局域网的用户相互通信呀?

P2P之UDP穿透NAT的原理与实现(附源代码)
这篇文章我也看了,用C写的代码我也看了,可是还是不太明白。
如何用delphi实现呀?(尤其是发送打洞信息,怎么才能判断无法链接上对方用户?又怎么样才能让对方向自己发送打洞信息呀)
请各位给点部分代码!
谢谢!

2楼: 很简单的 ,只要有个有固定ip的中专服务器就搞定了 如医药进销存软件

3楼: 我现在已经实现服务器中转了
我想让两个局域网中的用户直接联系,而不用服务器中专
如何实现?
也就是所谓的p2p,穿透NAT

4楼: 而且我用局域网中的客户端主动和一个外网的客户端链接,可以完成相互直接通讯。
但是外网的向内网的客户端主动链接,就不行!
当然,两个局域网中的客户端,怎么都链接为上,为什么?

注:两个客户端一模一样!

5楼: 你还是搞清一些名词"代理","路由",再看看你的思路,会有收获的

6楼: 可是我测试的机器和局域网,并没有使用代理
我也知道问题可能出现在路由上
可是不知道出现在哪!
ClientA在局域网,ClientB在一个外网的机器(它有独立的IP)
如果让ClientA主动和ClientB联系,同时让Server告诉ClientB向ClientA发送信息,这样就可以联系上了,两者可以直接相互通信(不是通过Server转发的)。
但是:如果让ClientB主动和ClientA联系,同时让Server告诉ClientA向ClientB发送信息,就不能成功。而且此时再让ClientA主动联系ClientB,并让Server告诉ClientB向ClientA发送信息,就怎么也链接不上!为什么?
如果过两三分钟后,再让ClientA主动和ClientB联系...................(重复这个操作)就又可以链接上了。
不知道为什么会这样,是不是UDP阻塞的原因?还是其它的原因?

财务软件版7楼: =========>>>>>>
而且我用局域网中的客户端主动和一个外网的客户端链接,可以完成相互直接通讯。
但是外网的向内网的客户端主动链接,就不行!
当然,两个局域网中的客户端,怎么都链接为上,为什么?

注:两个客户端一模一样!
===============>>>>
这里是因为你的Lan的主机主动连接外网,网关路由将你的主机IP和端口映射
成路由的XX端,外网连接路由的XX端,路由再转成你的Lan主机上的XX端口,肯定成功。
外网主动连接Lan内网,不成功是因为你的Lan的主机的端口没有被路由映射,
外网根本就不知道连接到那个端口,可能连接成功吗?这样只有通过服务中转才行, QQ的P2P参看下面.
Lan内两主机能相互访问没有经过路由,那能不成功呢?


//================================
(*
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信息而进行通讯。当然处
于局域网时这些操作又都是通过网吧服务器中的代理完成的。

具体怎么和代理通讯,数据包的格式你要找socks5的规范手册查查。
NAT就容易的多了。也是通过一个地址映射,比如你想要外面的机器访问你的本机的90端口,


你首先建一个UDPserver开始监听本机的90端口,然后通过本机的UDPserver向外网机器发数据包,
外网机器收到包时会取得来源的IP和PORT,这就是经过地址映射后你的器的IP和90端口在NAT盒的地址映射,
外网的机器通过身这个收到的IP和PORT发数据你的本地机器就可以收到了。注意的是,NAT映射有超时限制,
如果一定时间你没有数据活动的话就会被取消映射,所以QQ要一定时间就发几个包发出去来维持个有映射的活动,
可以看看NAT的RFC规范。
解说完毕

8楼: 谢谢楼上的老兄!
可是我的ClientA和ClientB在登陆服务器Server时,已经相互知道了对方在外网的IP和Port。
ClientA:外网的IP是59.82.108.162:3072,内网IP是192.168.1.123
ClientB:外网的IP218.98.141.6:4006(它是一个独立的IP)
------------------------------------------------------------------------------
操作如下:
ClientA在局域网,ClientB在一个外网的机器(它有独立的IP)
如果让ClientA主动和ClientB联系,同时让Server告诉ClientB向ClientA发送信息,这样就可以联系上了,两者可以直接相互通信(不是通过Server转发的)。
但是:如果让ClientB主动和ClientA联系,同时让Server告诉ClientA向ClientB发送信息,就不能成功。而且此时再让ClientA主动联系ClientB,并让Server告诉ClientB向ClientA发送信息,就是无论如何也连不上了!为什么?
如果过两三分钟后,再让ClientA主动和ClientB联系...................(重复这个操作)就又可以链接上了。
-----------------------------------------------------------------------------
我只用了一个UDPServer件,既发送又接收。跟这有关系吗?

9楼: 你的Server告诉给客户端的IP和端口是否正确,并且这条通道是否能正常通信,都有些怀疑,直接连(A连接B)可行,说明你的UPDServer控件运行正常.

====>>如果过两三分钟后,再让ClientA主动和ClientB联系...................(重复这个操作)就又可以链接上了。
======
可能是你的程序有问题

10楼: 服务器返回的语句是:ABinding.SendTo(ABinding.PeerIP,ABinding.PeerPort,strBlock,SizeOf(strBlock));
我的所有操作都有文本记录,也就是说:服务器显示的用户登陆的“用户名,IP,Port”和返回的“IP和Port”是一致的。而且ClientA和ClientB能通过服务器转发。

注:由于ClientB是一个独立的外网IP,所以ClientA(局域网中的机器)可以很容易联系,但为什么我从ClientB端接收的时候,发现ClientA在NAT上映射的端口和ClientA在服务器上登记的端口不一样呢?
也就是说:ClientA映射出来的IP和端口是:59.82.108.162:3000
ClientB的IP和端口是:218.98.141.6:4024
ClientA直接发送ClientB,ClientB收到的信息的IP和端口是59.82.108.162:50246
这是为什么呀?