A B要连接到S,肯定首先A B双方都会在本地创建一个socket,
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。
解决方案 »
- 不让DropDownList刷新页面,但OnSelectedIndexChanged事件需要触发,怎样实现
- System.Web.Dll为什么引用不上
- c# 如何获取文件大小,谢了!
- 应用程序跑着跑着就没了 错误日志如下
- msdn上的一段代码不能运行
- C#-WinForm 动态创建文本文件(.txt)!
- 如何使用sql语句防止注入式攻击?
- VS2010团队资源管理器报错解决呢?
- 在报表里设置了两个“参数字段”请问如何向参数字段传值,多谢
- c#怎么问题有点奇怪,关于pictureBox中image画图及保存的!!!
- 为什么在CHROME和火狐中正常使用,而在IE8和360不能。
- C#中出现“集合已修改;可能无法执行枚举操作”错误,怎么解决
我猜测,
udpClient.Send(内网地址); 连到的是一台服务器udpClient.Send(公网地址); 从 Internet 上绕了一圈,仍然连到了同一台服务器问题描述不够清楚,只是猜测,不承担任何责任,转帖过500与本人无关
并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则
NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。
udpClient.Send(内网地址);
就通了?真的就通了?
udpClient.Send(内网地址);
如果是拓管的服务器,从任何地方访问的都是相同的公网地址,不存在什么内网地址,只有可能存在内部局域网络(也就是速度会快点)。
如果是你们公司的网络,那就有公网地址和内网地址区分,那么从外面Send都是公网地址+端口,然后到路由器,由路由器设置访问的指定定端口是到哪台内网的IP。如果从内部局域网访问就直接用内网IP+端口