本帖最后由 xtaxa 于 2012-06-16 04:09:38 编辑

解决方案 »

  1.   

    这个问题还有40分在这里 http://topic.csdn.net/u/20120616/03/5aacbde3-7327-4230-af54-1fdee55f9c00.html?7652
      

  2.   

    看了你的描述 问题很复杂 还是没看明白 但是我们尝试下由原点出发 重新想这问题……
    问题就是NAT穿透?
    那么就得先由Server通过TCP告知Client对方的IP和端口 然后再有Client之间的UDP连接……
      

  3.   


    进过多次测试,发现果然是路由器的问题,gg和百度,都没有人说明如何解决这个问题,只搜索到一个帖子,轻描淡写说IMCP是杀手,想办法避免用你的扫描穷举的思路,偶尔能成功,但不100%成功。哎,再等等,看有高人出现没有,如果没有,分就全给你。我简单再说明下我的问题,应为上面说得太多,大家反而没有看明白。我现在遇到的问题是(假如现在位于路由器后的A要发消息给B):
    1.A用控件winsock1发消息给服务器,服务器得到A外网端口假如为1111
    2.A用控件winsock1发消息给B,B路由器得到A外网端口也为1111(但此时路由器会丢弃这个包)为了B路由器不丢弃这个包,我就要打洞,于是我这样做:
    1.A用控件winsock1发消息给服务器,服务器得到A外网端口假如为1111
    2.B从服务器得到A的外网IP和端口(1111),B给A的外网IP和端口(1111)发送打洞包
    3.A用控件winsock1发消息给B,此时,B路由器得到A外网端口将不再是1111了,问题就出在这里了,我估计就是第2步中的B向A打洞导致路由器A将重新映射A向B的端口
      

  4.   

    确实,,TCP P2P也碰到过这个问题,,想不明白为什么端口变了
      

  5.   

    我编了两个程序,一个是SERVER,运行在公网上,作为UDP包协调服务器,用以记录各客户端的上线状况;另一个就是CLIENT,可以运行在公网上,也可以运行在内网中.
    如果一个客户在公网,另一个客户在内网,可以实现UDP打洞,穿透NAT. 但如何两台机器均在内网(即在NAT之后),则无法打洞.因为,客户端出NAT时的端口发生了变化.
    我现在遇到这样的问题,不知楼主的打洞是否成功?