我正在创建服务器客户端应用程序。我已经能够连接到同一网络上的应用程序。例如,我可以连接到10.0.0.3
和10.0.0.4
。
现在,我一直在尝试连接到我的外部IP,并且收到以下消息:
System.Net.Sockets.SocketException (0x80004005). No connection could be made because the target machine actively refused it.
listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
write = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
end = new IPEndPoint(IPAddress.Parse(IP), 3212);
write.Connect(end);
我的代码或路由器设置是否有问题?还是您无法连接到自己...但是考虑到我可以连接到
127.0.0.1
,这没有任何意义。
最佳答案
这是一个常见的环回错误,因为在进行Internet NAT重定向时,您的路由器会感到困惑。您的外部IP是分配给调制解调器/路由器的...不是您的计算机,请记住,您的路由器可以在一个单一的外部IP下处理网络中一个以上设备的流量,然后使用NAT将流量重定向到特定的本地连接设备。一个示例是,您的家庭网络中有2台计算机,一台打印机和2台移动设备,所有这些设备均通过wi-fi连接到您的家庭网络,所有这些设备都将通过DHCP分配一个本地IP地址,但是,外部IP所有本地设备的地址都相同,因为外部IP地址已分配给您的路由器。
连接到本地网络设备时,请始终使用本地IP地址,而不要使用外部IP地址。
编辑
我希望使答案尽可能简单,但是Scott的评论使我重新考虑添加有助于社区的细节总是很有用的。
基本上,您实际上可以设置端口转发,它允许路由器将在特定端口中接收的传入流量重定向到本地网络中的指定设备。这将使您的设备可以从该特定端口上的网络外部访问,并且您可以轻松地利用此优势,使用外部IP地址从本地网络内部连接至套接字。不利的一面是,并非所有路由器/调制解调器都支持端口转发,因此您必须引用调制解调器的手册并检查其是否受支持。
但是,如果您仅出于要使用外部IP从本地网络连接设备的原因进行设置,则建议您不要这样做,而要使用内部IP地址,那么您实际上并不想这样做。应对将本地设备暴露给Internet所涉及的安全风险。您可以轻松地为外部人员设置严格的防火墙规则,并在本地网络中提供更宽松的安全性。
关于c# - 使用.NET套接字连接到我自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843191/