我搜索过很多文章了,总感觉很多人完全在那乱说,明明人家问怎么让网内PC和公网server通讯, 有人总是不负责任的乱贴一些LAN里面通讯的简单例子.我有几个困惑:
1. 通常IM软件设置http代理就可以使用了,他们是利用UDP打洞技术来做的么?
2. IM软件设置sock4/sock5代理也可以让网内PC和公网server通讯, 这个是UDP打洞技术么?
3. 打洞技术提到的nat是不是就是上面提到的这些代理服务器充当的角色?服务器并没有设置这些转换规则啊,难道代理服务器都默认支持这种nat方式么?
4. C#里面用udpclient类是不是没有办法做到udp打洞?用socket呢?有人有类似代码参考么?

解决方案 »

  1.   

    》》1. 通常IM软件设置http代理就可以使用了,他们是利用UDP打洞技术来做的么?
    HTTP代理本质还是通过公网Server来转发数据包的,跟UDP打洞是两回事。》》2. IM软件设置sock4/sock5代理也可以让网内PC和公网server通讯, 这个是UDP打洞技术么?
    不是的,我们通常说的UDP打洞,其实是指穿透NAT。》》3. 打洞技术提到的nat是不是就是上面提到的这些代理服务器充当的角色?服务器并没有设置这些转换规则啊,难道代理服务器都默认支持这种nat方式么?
    呵呵,穿透NAT也需要一个公网服务器来联系的,但两个内网连接成功后(打洞成功),就不需要公网服务器了,此时两个内网的应用程序可以通过UDP直接收发数据包(P2P)。》》4. C#里面用udpclient类是不是没有办法做到udp打洞?用socket呢?有人有类似代码参考么?
    理论上只要使用UDP协议就可以打洞,但NAT也分很多种,有些NAT是不能穿透的。
      

  2.   

    非常感谢上面的解释.那么如何让udpclient通过http代理来和外部的server通讯?你说的理论上只要使用udp协议就可以打洞什么意思?用socket的?
      

  3.   

    to 楼主:
    我对.net中关于winsock方面的类没有研究,所以我不知道怎样使用UdpClient类。建议你阅读一些winsock和TCP/IP协议方面的资料。用UDP穿透NAT并不复杂,网络上的资料和代码已经非常多了。
      

  4.   

    to intraweb:
    那么就是说内网PC和外网server不需要打洞来通讯?那么外网发送的包怎么透过网关传输到内网PC阿.
      

  5.   

    NAT有2种,1种是TCP穿透,第2种是UDP穿透。后面那种就是LZ说的,TCP穿透只在理论上见到过实际没人做成过。UDP在CSDN上也有人帖过代码,LZ找找看
      

  6.   

    代理和NAT的本质区别是,代理需要服务器一直存在,作为传递数据的中间媒介。而穿透只需要利用服务器来获取路由权限,建立连接,而数据传递是点对点的,所以,大多数IM都是利用NAT穿透来实现点对点的通信,服务器只是起到维护用户列表和状态的作用。