我正在进行一些套接字测试。我正在尝试将客户端连接到服务器的外部/公共IP地址。不幸的是,虽然我找到了一个开放端口,但套接字不会响应其外部/公共IP。这是服务器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace PortScannerServer
{
class Program
{
static void Main(string[] args)
{
Console.Title = "Server";
while (true)
{
try
{
_server.Bind(new IPEndPoint(IPAddress.Any, 0));
_server.Listen(10);
Console.WriteLine(_server.LocalEndPoint.ToString());
Console.WriteLine(GetExternalAddress().ToString());
_server.Accept();
Console.WriteLine("Connected");
break;
}
catch (Exception ex)
{
Console.WriteLine(ex.Source + ":" + ex.Message + ":" + ex.InnerException);
}
}
}
static IPAddress GetExternalAddress()
{
var html = new WebClient().DownloadString("http://checkip.dyndns.com/");
var ipStart = html.IndexOf(": ", StringComparison.OrdinalIgnoreCase) + 2;
return IPAddress.Parse(html.Substring(ipStart, html.IndexOf("</", ipStart, StringComparison.OrdinalIgnoreCase) - ipStart));
}
static Socket _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
}
以下是客户端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace PortScanner
{
class Program
{
static void Main(string[] args)
{
Console.Title = "Client";
Console.WriteLine("Enter host ip");
_ip = IPAddress.Parse(Console.ReadLine());
Console.WriteLine("Enter host port");
_port = Convert.ToInt32(Console.ReadLine());
while (true)
{
try
{
_client.Connect(new IPEndPoint(_ip, _port));
Console.WriteLine("Connected!");
Console.ReadLine();
break;
}
catch
{
Console.WriteLine("Could not connect to client");
}
}
}
static IPAddress _ip;
static int _port;
static Socket _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
}
如果我将ip地址设置为本地ip(127.0.0.1或192.168.1.1),我可以让客户端连接,但是,当我将ip地址设置为外部/公共时,它不会连接IP。有谁知道如何解决这个问题?
答案 0 :(得分:1)
根据您的描述,您尝试连接的服务器与客户端位于同一内部网络上(您说127.0.0.1
工作的事实让我觉得它甚至可能是同一台机器。)< / p>
要支持导航到公共地址,然后转发到原始网络中的内部地址,您的NAT路由器需要支持名为“Hairpinning”或“NAT Loopback”的功能。许多消费者SOHO路由器不支持此功能,如果它们支持该功能,则不会在文档中经常标记这些功能。
您需要将路由器上的固件升级/更换为支持发夹的固件或完全替换路由器with one that does,以便能够将您的公共IP重定向到内部网络上的计算机路由器。
除了不使用公共IP并使用内部IP之外,您的代码中无法解决此问题。