我正在编写一个P2P软件,需要直接连接到互联网。它是分散的,因此没有永远在线服务器可以联系服务器尝试连接回服务器的请求,以便观察连接尝试是否到达。
有没有办法测试防火墙状态的连接?
我想在我的梦想之地,希望是马,会有某种第三方,公共的,已经存在的服务器,我可以发送某种简单的命令,他们会发送一个特殊的ping回来。然后,我可以简单地听一下,看看是否到了,知道我是否在防火墙后面。
即使不存在这样的事情,是否有可用的替代路线?
答案 0 :(得分:3)
Nantucket - 您的服务是否在UDP或TCP上侦听?
对于UDP - 您所描述的是STUN protocol所设计的内容。它符合您对“某种简单命令的定义,它们会发送一个特殊的ping”
STUN是一种非常“ping”(UDP)协议,用于服务器向客户端回送它看到客户端的IP和端口。然后,客户端可以使用来自服务器的响应,并将结果与其认为其本地枚举的IP地址进行比较。如果服务器的响应与本地枚举的IP地址匹配,则客户端主机可以自行确定它是否直接连接到Internet。否则,客户端必须假设它位于NAT后面 - 但对于大多数路由器,您刚刚创建了一个可用于其他P2P连接方案的端口映射。
此外,您可以使用服务器的STUN绑定请求中的RESPONSE-PORT attribute来响应不同的端口。这样可以有效地检测您是否有防火墙。
TCP - 这有点棘手。 STUN可以部分用于确定您是否在NAT后面。或者只是向whatismyip.com发出http请求并解析结果以查看是否存在NAT。但它变得棘手,因为我知道互联网上没有服务会测试TCP连接给你。
考虑到上述所有因素,绝大多数宽带用户可能都支持NAT,后者也可以充当防火墙。由ISP或他们自己的无线路由器设备提供。即使它们不是,大多数操作系统都有某种最小的防火墙来阻止未经请求的流量。因此,拥有一个P2P客户端非常有限,只能在直接连接上工作。
据说,在Windows上(可能还有其他人),您可以对应用程序的安装包进行编程,以便在Windows防火墙中注册,这样就不会阻止它。但是,如果您不是针对Windows,则可能需要用户手动修复其防火墙软件。
哦,无耻的插头。您可以使用支持上述所有语义的open source STUN server and client library。如果您需要访问昏迷服务,请离线跟进我。答案 1 :(得分:1)
您可能会发现这篇文章很有用
http://msdn.microsoft.com/en-us/library/aa364726%28v=VS.85%29.aspx
我将从每个操作系统开始,询问防火墙服务是否已打开。其次,我将尝试套接字连接,并根据错误代码确定连接是重置还是超时。我只熟悉winsock编码,所以对于Linux或mac os来说我真的不怎么说。