vc++中socket用UDP通信的问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 16:29:53
我的服务器有公网IP,客户端是在路由后面,客户端向服务器发一个UDP包,服务器能收到,按理说这就应该打洞成功了,可是服务器按照收到的IP和端口发回去对方却收不到。
同在内网或同在公网的时候工作正常,证明不是别的问题,应该还是UDP穿透的事。
哪位有经验的说说可能是什么原因。
已经解决了。
问题在于使用了多线程之后,服务器端有多个Socket绑定了不同端口。但事实上UDP打洞不光是单向的,而且会绑定远方端口,路由只会将打通的目标IP和目标端口送来的数据包传给客户端主机。而相同IP不同端口送来的包这都会被扔掉,即使这些包的目的地是本地已经打通的“洞”。
解决的方法就是多个线程使用同一Socket,结果就正常了。
专门写出来让大家以后少走弯路。。。

这个问题我也遇到过。
不是UDP的问题,协议本身没问题,如果要了解相关只是,请参考TCP/IP协议方面的资料。
首先你要明确,路由过后的IP地址是虚IP,比如:192.168.1.9(一般以192开头) 而UDP协议通信要求IP必须为真实IP,比如:125.*.*.* 所以当服务器向客户端发送数据的时候,由于找不到对方IP(真实IP),所以客户端接收失败。

解决这个问题有一个方法:就是将客户机映射为虚拟主机,从而获得公网IP。
具体方法:打开浏览器,输入192.168.0.1,用户名和密码一般为admin,然后点击【虚拟服务器】,然后【DMZ主机】,然后【启用】打钩,最后保存就ok了!

应该是这个原因:
你的客户端应该是使用的私有IP地址(比如:192.168.1.23),它通过NAT(位于路由器上)访问公网,所以客户端发送的数据服务端能够接收到,而且服务器并不知道你客户端的地址是192.168.1.23,它认为是你路由器转换后的地址.所以不难想象为什么服务端向客户端发送数据不成功了.
应该需要在路由器上做相应设置(比如:映射特定端口---比如:12345---到你的客户端机器192.168.1.23),这样服务端只要向你的路由器地址发送数据(端口号12345),路由器便会将数据转发到192.168.1.23的机器上了,而服务端并不知道客户端真实地址(192.168.1.23).

希望能够帮助到你.