再提关于UDP协议的一些问题

Description of your first forum.

再提关于UDP协议的一些问题

帖子YuanLiang » 星期二, 2004年10月19日 16:58


服务器B在公网上,客户端A1,A2均在局域网内,通讯协议均为UDP

1.客户端A1向服务器B发包,服务器B收到后,得到A1的IP地址和端口,
将返回包发给A1,A1收到;

2.客户端A2向服务器B发包,服务器B收到后,得到A2的IP地址和端口
将返回包发给A2,A2收到;

3.A1通过询问服务器B得到A2的IP地址和端口

4.A2通过询问服务器B得到A1的IP地址和端口

问题一
 A1向询问到的A2的IP地址和端口上发包,结果A2收不到;同样的,
A2发包给A1,A1也收不到;如何才能让A1与A2相互通信?上面的步骤
缺少什么?

问题二
 服务器端线程1负责处理用户请求,线程2负责给用户送某些消息,用
户A先发请求,线程1得到A的IP和端口,然后线程2向线程1得到的A的IP
和端口上发包,结果A收不到,只有线程1发给A的包A才能收到,为何?
如何能让线程2与A通信?
 
 
 

再提关于UDP协议的一些问题

帖子视觉音乐 » 星期五, 2004年10月22日 16:58


来自:HAZL, 时间:2004-3-10 18:35:10, ID:2496064
NAT的原理我上面不是说了吗,关键是发送数据是不要用UDPclient来发,因为udpclient发送是是随机bind的port,这样通过NAT代理时映射的端口和IP也是随机的,你的服务端收到的就是这个NAT随机映射,你再往这个收到的peerIP和peerPort发东西,会被NAT代理送到你本机的UDPclient发送数据时随机绑定的端口,而你并没有临听这个随机端口。
解决的方法用的IDPserver来发送数据,这样你在NAT的映射就是对应IDPserver的临听端口,外网服务器根据这个映射peerIP和Peerport发回来的数据你的UDPserver才能收的到。
注意的一点时,你的UDPServer要按一定的时间间隔不断的发送数据包,以维护在NAT端的映射端口不超时,否则的话NAT会重新映射的。
 
 
 

再提关于UDP协议的一些问题

帖子yxp132 » 星期五, 2004年10月22日 19:04


主要的还是和内网的连接,这个比较麻烦。
 
 
 

再提关于UDP协议的一些问题

帖子lfzxs » 星期六, 2004年10月23日 13:51


问题一:
  5.A1向A2发包,无法收到;
   A2向A1发包,无法收到。
  6.A1向A2发包,收到;
   A2向A1发包,收到。
问题二:
    线程1,2用了不同的Sock,让1,2用同一个Sock发送
 
 
 

再提关于UDP协议的一些问题

帖子acheqi » 星期六, 2004年10月23日 15:35


连接服务器用tcp/ip,客户端相连再用udp
 
 
 

再提关于UDP协议的一些问题

帖子kkkchenA » 星期六, 2004年10月23日 23:11


我想,如果全部UDP控件都用idUDPServer来进行数据的发送与接收的话,问题可以解决。
我想楼主是要进行两个都在内网中的用户之间的直接通信吧,我也做过同样的事情。
 
 
 

再提关于UDP协议的一些问题

帖子zyt_1978 » 星期日, 2004年10月24日 01:41


学学
 
 
 

再提关于UDP协议的一些问题

帖子djh_djh » 星期日, 2004年10月24日 15:49


这是一个防火墙的问题如果是可以这样做
首先
1  A1 A2 都通过服务器得到对方公网IPA1 PORTA1 IPA2 和 POARTA2
2  A1 向 IPA2  POARTA2 + 1 发一条消息,打开A1 ,与NAT的通道,这条消息肯定被A2的
   NAT丢掉
3 A1通过服务器指示A2 向 A1 另一端口发一条消息
4 这样就OK了

详细程见 RFC 3489 (如果我没记错的话)
 
 
 

再提关于UDP协议的一些问题

帖子delphigbg » 星期日, 2005年1月2日 10:43


3 A1通过服务器指示A2 向 A1 另一端口发一条消息
这个是如何实现的
 
 
 

再提关于UDP协议的一些问题

帖子炼火玄冰 » 星期日, 2005年1月2日 11:19


这个不就是腾讯QQ的视频及文件传输的实现么?大家都讲的非常清楚了,有人管这个叫撞墙原理。
 
 
 

再提关于UDP协议的一些问题

帖子dos1234 » 星期日, 2005年1月2日 23:16


问题一:
就是所胃的UDP Hole Punching...
偶也在弄这个,多交流。。。。
转摘录如下:
-------------------------------------------------
我们假设 Client A 和 Client B 都拥有自己的私有IP地址,并且都处在不同的NAT之后,端对端的程序运行于 CLIENT A,CLIENT B,S之间,并且它们都开放了UDP端口1234。 CLIENT A和CLIENT B首先分别与S建立通信会话,这时NAT A把它自己的UDP端口62000分配给CLIENT A与S的会话,NAT B也把自己的UDP端口31000分配给CLIENT B与S的会话。

假如这个时候 CLIENT A 想与 CLIENT B建立一条UDP通信直连,如果 CLIENT A只是简单的发送一个UDP信息到CLIENT B的公网地址138.76.29.7:31000的话,NAT B会不加考虑的将这个信息丢弃(除非NAT B是一个 full cone NAT),因为 这个UDP信息中所包含的地址信息,与CLIENT B和服务器S建立连接时存储在NAT B中的服务器S的地址信息不符。同样的,CLIENT B如果做同样的事情,发送的UDP信息也会被 NAT A 丢弃




   假如 CLIENT A 开始发送一个 UDP 信息到 CLIENT B 的公网地址上,与此同时,他又通过S中转发送了一个邀请信息给CLIENT B,请求CLIENT B也给CLIENT A发送一个UDP信息到 CLIENT A的公网地址上。这时CLIENT A向CLIENT B的公网IP(138.76.29.7:31000)发送的信息导致 NAT A 打开一个处于 CLIENT A的私有地址和CLIENT B的公网地址之间的新的通信会话,与此同时,NAT B 也打开了一个处于CLIENT B的私有地址和CLIENT A的公网地址(155.99.25.11:62000)之间的新的通信会话。一旦这个新的UDP会话各自向对方打开了,CLIENT A和CLIENT B之间就可以直接通信,而无需S来牵线搭桥了。(这就是所谓的打洞技术)!
----------------------------------------------------------
 
 
 

再提关于UDP协议的一些问题

帖子leaber » 星期四, 2005年1月6日 14:54


没看太明白, 真乱。

UDP打洞已经很成熟了,当然如果你的NAT类型是对称的话就只能转发了。