0

ソケット プログラミングを学習しようとしていますが、サーバー アプリケーションへの接続中にこのエラーが発生しました。

サーバー アプリケーションでの TcpListener の宣言は次のとおりです。

TcpListener listener = new TcpListener(IPAddress.Loopback, 5152);

クライアント アプリケーションでの TcpClient の宣言は次のとおりです。

TcpClient client = new TcpClient(Dns.GetHostEntry(IPAddress.Loopback).HostName, 5152);

このような質問をいくつか読みましたが、いつも同じ答えが返ってきます。サーバー アプリケーションがポートをリッスンしていないか、まったく実行されていません。しかし、netstat を使用してリソース モニターと cmd を再確認し、サービスがポートをリッスンしているかどうかを確認しました。ファイアウォールの例外にもサービスを含めたので、サーバー アプリに接続しようとしているときにこのエラーが発生し続ける理由がわかりません。

何か案は?

4

1 に答える 1

2

Dns.GetHostEntry(IPAddress.Loopback).HostNameマシンのホスト名を返します。ホスト名を に渡すと、TcpClientを使用して 1 つまたは複数の IP アドレスに解決されますDns.GetHostAddresses(hostName)。これには、マシンのパブリックおよびリンクローカル IP アドレス (例: 192.168.15.4) が含まれますが、ループバック アドレス (127.0.0.1) は含まれません。

したがって、クライアントはマシンの非ループバック アドレスのいずれかに接続しようとしていますが、サーバーはループバック アドレスでのみリッスンしています。したがって、接続を確立できません。

解決策:サーバーがリッスンしているのと同じエンドポイントに接続します。

IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 5152);

TcpListener listener = new TcpListener(endPoint);

TcpClient client = new TcpClient();
client.Connect(endPoint);
于 2013-05-12T16:59:00.540 に答える