如使两个局域网(通过局域网连接internet)内的两个节点之间传送数据?

时间:2022-10-14 20:13:09
一\环境:
以下的两个局域网都可以连接到internet,局域网内的机器通过路由器共享上网
1\局域网A:外网ip 211.157.1.3

         局域网内的节点A:192.168.1.2:60001
2\局域网B:外网ip 211.157.1.4

         局域网内的节点B:192.168.2.2:60002

二\实现功能
那么我如何实现节点A与节点B间的数据传送呢?
通过TCP或UDP,但IpEndPoint应该是什么呢?


22 个解决方案

#1


最简单的webservice

#2


可是如何实现呢?

我只是想做节点到节点间的数据传送.

#3


这个是典型的P2P问题
一般通过UDP进行通讯

涉及到UDP的打洞原理

需要一台外部的机器来协助打洞

#4


yumanqing 指的是通过在服务器端发布一个web service(FileService)来实现客户端 -> FileService的下载文件与上传文件吗?

#5


cxx1997 指的是需要代理还是需要做Network Address Translation,网络地址转换(早上在我的帖子中看到的)?

#6


你说的点对点传输,类似QQ的,可能webservice不适合,不过也可以实现

#7


web service是需要发布后使用的资源,需要如何操作呢?

#8


我想web service的方式,是通过中转服务器来中转所有数据

我讲的P2P模式下,是需要一个网络地址转换负责帮助两个点建立连接,连接建立后就可以直接访问对方

否则的话就需要有一台机器能提供外网访问端口了



如果你已知你的网络设备类型,还可以通过广播的方式来寻找连接所需要的端口,不过就不通用了,你需要非常确定两台机器的上网类型

#9


TO:cxx1997 

我刚看到一篇有关P2P与NET的文章 ,上面的P2P服务器端的作用就和你说的
web service差不多,测试一下代码看看是否能实现:)

#10


这个问题是什么意思啊
是不是大家搞错了啊
他只是想局域网的两个点通讯,不是要和外部通讯啊
System.Net.IPEndPoint ip = new IPEndPoint("192.168.1.2", 60001);
这样就可以吧,需要P2P吗

路由器难道不知道这个是另外一个内网的IP吗,肯定会转发到另外一个内网吧
小弟乱说的,错了不要骂人啊

#11


楼上的小兄弟考虑的问题还比较少啊

内网里很多机器,路由器怎么知道你是发给哪台呢?

所以P2P还是很复杂的

#12


欢迎大家讨论和帮助:)

#13


關注,幫頂。

#14


谁给提供一个公网地址测试一下P2P的程序先~~~~~~~~~~~`

#15


关于P2P,我的理解:
一\P2P的环境
1\P2P服务器:用于存储客户端的信息(如客户端网络端点地址,客户端属性等等)
2\P2P客户端:至少2个,这样才能达到客户端向客户端共享的需要
P2P客户端启动时都需要向P2P服务器发送登陆消息
并从P2P服务器得接收到其它所有P2P客户端信息(如客户端网络端点地址等),
退出时都要向P2P服务器发送注销消息


二\P2P运行流程
1\P2P服务器启动,随时监听P2P客户端的登陆\注销等等事件
2\由私网的网络端点转换为公网的网络端点
这P2P客户端各自的NAT(Network Address Translators)来完成的,
(如私网网络端点1.1.1.1:1000 =>公网网络端点211.157.1.3:40000),
并且在P2P客户端向P2P服务器端发送登陆请求时由服务器记录下其公网的网络端点地址(211.157.1.3:40000)

三、示例
1、环境
P2P服务器:211。157。1。1:1000
P2P客户端A:192。168。1。2:2000(私网端点)、211。157。1。2:2000(对应的公网端点)
P2P客户端B:192。168。1。3:3000(私网端点)、211。157。1。3:3000(对应的公网端点)

2、事件:P2P客户端A、P2P客户端B登陆到P2P服务器后,P2P客户端B向P2P客户端A发送共享数据
P2P服务器启动.....
P2P客户端A,登陆到P2P服务器.....:P2P服务器记录P2P客户端A的网络端点-211。157。1。2:2000......
P2P客户端B,登陆到P2P服务器.....:P2P服务器记录P2P客户端B的网络端点-211。157。1。3:3000......
P2P服务器向P2P客户端广播发送所有P2P客户端信息(公网网络端口等等)......
P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)......

=============================================================

上面是我的个人理解,由于没有公网服务器做测试,希望能看到大家的看法:)

#16


所以我理解的web service服务实现,也只是WEB SERVICE替代了如上的P2P服务器,

也可以使用其它的东东来替代P2P服务器。

#17


序列化数据进行传输啊

#18


该回复于2007-10-17 10:53:04被版主删除

#19


是的,如上面的解释C -> S S-> C C->C 数据都是序列化数据进行传输的,

序列化数据进行传输感觉不是P2P的重点吧....

#20


P2P有一个很重要的能力就是判断 节点的上网类型

NAT设备在处理内网和外网映射时区别很大
最简单的是端口不变的映射

对于协议而言,UDP穿透比较容易,如果你想建立TCP的穿透连接,就困难很多了

web service服务在处理这个方面能力比较弱,你需要直接取得SOCK包,甚至要伪造SOCK包来完成


#21


2、事件:P2P客户端A、P2P客户端B登陆到P2P服务器后,P2P客户端B向P2P客户端A发送共享数据 
P2P服务器启动..... 
P2P客户端A,登陆到P2P服务器.....:P2P服务器记录P2P客户端A的网络端点-211。157。1。2:2000...... 
P2P客户端B,登陆到P2P服务器.....:P2P服务器记录P2P客户端B的网络端点-211。157。1。3:3000...... 
P2P服务器向P2P客户端广播发送所有P2P客户端信息(公网网络端口等等)...... 
P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)...... 


比如你这个描述,
第一NAT必须是端口不变的映射
第二P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)......  
   这一消息,会被A的路由器自动放弃(2000端口是只用于和P2P服务器打交道的,其它IP对这个端口的包,被认为是攻击)

所以你根本建立不起连接,要完成这一步骤,你需要找本P2P的书,好好了解下
目前P2P做的最好的,我觉得是SKPYTE,基本上QQ\MSN都用不起来的情况下,SKPYTE是最后的选择

#22


感谢大家的帮助和讨论,接分了:)

#1


最简单的webservice

#2


可是如何实现呢?

我只是想做节点到节点间的数据传送.

#3


这个是典型的P2P问题
一般通过UDP进行通讯

涉及到UDP的打洞原理

需要一台外部的机器来协助打洞

#4


yumanqing 指的是通过在服务器端发布一个web service(FileService)来实现客户端 -> FileService的下载文件与上传文件吗?

#5


cxx1997 指的是需要代理还是需要做Network Address Translation,网络地址转换(早上在我的帖子中看到的)?

#6


你说的点对点传输,类似QQ的,可能webservice不适合,不过也可以实现

#7


web service是需要发布后使用的资源,需要如何操作呢?

#8


我想web service的方式,是通过中转服务器来中转所有数据

我讲的P2P模式下,是需要一个网络地址转换负责帮助两个点建立连接,连接建立后就可以直接访问对方

否则的话就需要有一台机器能提供外网访问端口了



如果你已知你的网络设备类型,还可以通过广播的方式来寻找连接所需要的端口,不过就不通用了,你需要非常确定两台机器的上网类型

#9


TO:cxx1997 

我刚看到一篇有关P2P与NET的文章 ,上面的P2P服务器端的作用就和你说的
web service差不多,测试一下代码看看是否能实现:)

#10


这个问题是什么意思啊
是不是大家搞错了啊
他只是想局域网的两个点通讯,不是要和外部通讯啊
System.Net.IPEndPoint ip = new IPEndPoint("192.168.1.2", 60001);
这样就可以吧,需要P2P吗

路由器难道不知道这个是另外一个内网的IP吗,肯定会转发到另外一个内网吧
小弟乱说的,错了不要骂人啊

#11


楼上的小兄弟考虑的问题还比较少啊

内网里很多机器,路由器怎么知道你是发给哪台呢?

所以P2P还是很复杂的

#12


欢迎大家讨论和帮助:)

#13


關注,幫頂。

#14


谁给提供一个公网地址测试一下P2P的程序先~~~~~~~~~~~`

#15


关于P2P,我的理解:
一\P2P的环境
1\P2P服务器:用于存储客户端的信息(如客户端网络端点地址,客户端属性等等)
2\P2P客户端:至少2个,这样才能达到客户端向客户端共享的需要
P2P客户端启动时都需要向P2P服务器发送登陆消息
并从P2P服务器得接收到其它所有P2P客户端信息(如客户端网络端点地址等),
退出时都要向P2P服务器发送注销消息


二\P2P运行流程
1\P2P服务器启动,随时监听P2P客户端的登陆\注销等等事件
2\由私网的网络端点转换为公网的网络端点
这P2P客户端各自的NAT(Network Address Translators)来完成的,
(如私网网络端点1.1.1.1:1000 =>公网网络端点211.157.1.3:40000),
并且在P2P客户端向P2P服务器端发送登陆请求时由服务器记录下其公网的网络端点地址(211.157.1.3:40000)

三、示例
1、环境
P2P服务器:211。157。1。1:1000
P2P客户端A:192。168。1。2:2000(私网端点)、211。157。1。2:2000(对应的公网端点)
P2P客户端B:192。168。1。3:3000(私网端点)、211。157。1。3:3000(对应的公网端点)

2、事件:P2P客户端A、P2P客户端B登陆到P2P服务器后,P2P客户端B向P2P客户端A发送共享数据
P2P服务器启动.....
P2P客户端A,登陆到P2P服务器.....:P2P服务器记录P2P客户端A的网络端点-211。157。1。2:2000......
P2P客户端B,登陆到P2P服务器.....:P2P服务器记录P2P客户端B的网络端点-211。157。1。3:3000......
P2P服务器向P2P客户端广播发送所有P2P客户端信息(公网网络端口等等)......
P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)......

=============================================================

上面是我的个人理解,由于没有公网服务器做测试,希望能看到大家的看法:)

#16


所以我理解的web service服务实现,也只是WEB SERVICE替代了如上的P2P服务器,

也可以使用其它的东东来替代P2P服务器。

#17


序列化数据进行传输啊

#18


该回复于2007-10-17 10:53:04被版主删除

#19


是的,如上面的解释C -> S S-> C C->C 数据都是序列化数据进行传输的,

序列化数据进行传输感觉不是P2P的重点吧....

#20


P2P有一个很重要的能力就是判断 节点的上网类型

NAT设备在处理内网和外网映射时区别很大
最简单的是端口不变的映射

对于协议而言,UDP穿透比较容易,如果你想建立TCP的穿透连接,就困难很多了

web service服务在处理这个方面能力比较弱,你需要直接取得SOCK包,甚至要伪造SOCK包来完成


#21


2、事件:P2P客户端A、P2P客户端B登陆到P2P服务器后,P2P客户端B向P2P客户端A发送共享数据 
P2P服务器启动..... 
P2P客户端A,登陆到P2P服务器.....:P2P服务器记录P2P客户端A的网络端点-211。157。1。2:2000...... 
P2P客户端B,登陆到P2P服务器.....:P2P服务器记录P2P客户端B的网络端点-211。157。1。3:3000...... 
P2P服务器向P2P客户端广播发送所有P2P客户端信息(公网网络端口等等)...... 
P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)...... 


比如你这个描述,
第一NAT必须是端口不变的映射
第二P2P客户端B向P2P客户端A发送数据(B从P2P服务器上获得的A的网络端点211。157。1。2:2000)......  
   这一消息,会被A的路由器自动放弃(2000端口是只用于和P2P服务器打交道的,其它IP对这个端口的包,被认为是攻击)

所以你根本建立不起连接,要完成这一步骤,你需要找本P2P的书,好好了解下
目前P2P做的最好的,我觉得是SKPYTE,基本上QQ\MSN都用不起来的情况下,SKPYTE是最后的选择

#22


感谢大家的帮助和讨论,接分了:)