爲了學習目的,我開發了一個在本地網絡上工作的異步服務器/客戶端應用程序。但是現在我想讓它能夠連接到我的公共IP地址,所以我的服務器可以從任何地方訪問。C#公共IP客戶端/服務器
這裏是服務器代碼的相關部分,它似乎是工作得很好:
static void Main(string[] args)
{
AsyncServer server = new AsyncServer(60101);
server.RunAsync();
Console.Read();
}
public class AsyncServer
{
private IPAddress ipAddress;
private int port;
public AsyncServer(int port)
{
this.port = port;
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
this.ipAddress = null;
for (int i = 0; i < ipHostInfo.AddressList.Length; i++)
{
if (ipHostInfo.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
this.ipAddress = ipHostInfo.AddressList[i];
break;
}
}
if (this.ipAddress == null)
throw new Exception("No IPv4 address for server.");
}
public async void RunAsync()
{
TcpListener tcpListener = new TcpListener(this.ipAddress, this.port);
tcpListener.Start();
下面是客戶端代碼的相關部分。這是它無法連接的地方。
static void Main(string[] args)
{
AsyncClient client = new AsyncClient("MyPublicIP", 60101);
client.ConnectAsync().Wait();
Console.Read();
}
}
public class AsyncClient
{
private IPAddress ipAddress;
private int port;
public AsyncClient(string ip, int port)
{
this.port = port;
IPAddress.TryParse(ip, out ipAddress);
}
public async Task ConnectAsync()
{
int attempts = 0;
TcpClient client = new TcpClient();
while (!client.Connected)
{
try
{
attempts++;
client.Connect(this.ipAddress, this.port);
Console.Clear();
Console.WriteLine("Connected");
await ProcessAssync(client);
}
catch (SocketException)
{
Console.Clear();
Console.WriteLine("Connection Attempts: {0}", attempts);
我已經在我的路由器上進行端口轉發到我的本地服務器IP「192.168.254.1」所使用的端口「60101」,但沒有什麼變化,他只是不斷嘗試出現了一會兒,然後失敗連接。
他不會被連接到192.168.254.1 ..他需要你的互聯網IP地址,這就是當地的一個 – BugFinder
是,192.168.254.1是我的地方IP,但這是我需要的服務器的權利?因此,服務器會監聽給定端口上發送給此IP的所有內容,就像我設置端口轉發一樣。然後在客戶端上,我不試圖連接到它,它試圖連接到我的公共IP。這不是應該如何? –
是的,這聽起來正確。所以問題可能是ISP過濾或轉發不工作或其他事情。 –