0

サーバーがリモートホストであるC#で1つのクライアントサーバーアプリケーションを構築しています。ネットワークにルーターとファイアウォールがあります。

私のクライアント側のコードは

hostSocket = new TcpClient();                
hostSocket.Connect(serverIp, serverPort);

そして私のサーバーサイドコードは

eqListner = new TcpListener(IPAddress.Parse(eqIp), eqPort);

このシナリオでは、ip 127.0.0.1を指定することで同じPC上のクライアントに接続できますが、ネットワーク内の別のPCでサーバーを実行した場合は接続できません。

次に、次のようにしてサーバー側のコードを変更しました。

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, eqPort);
TcpListener eqListner = new TcpListener(ipLocalEndPoint);

しかし、それでも結果は同じです。次に、これによってサーバー側のコードを再度変更しました。

eqListner = new TcpListener(IPAddress.Any, eqPort);

そして、これは完全にうまく機能します。のmsdnを読んだIPAddress.Anyところ、このプロパティにより、すべてのネットワークインターフェイスでクライアントアクティビティをリッスンするようにサーバーが設定されていることがわかりました。

私の質問は、なぜIPAddress.Anyがリモートホストに接続する必要があるのか​​ということです。と他の機能は接続できませんか?

前もって感謝します....

4

2 に答える 2

0

このシナリオでは、ip 127.0.0.1を指定することで同じPC上のクライアントに接続できますが、ネットワーク内の別のPCでサーバーを実行した場合は接続できません

127.0.0.1は常にローカルホストであるループバックアドレスです。サービスとクライアントが同じマシン上にある場合、これは便利です。

サーバーがアドレスを変更した場合にアプリケーションを更新または再起動する必要がない場合は、すべてのインターフェイスでリッスンするようにサービスをコーディングすることをお勧めします。

于 2013-03-21T10:43:25.683 に答える
0

問題は最初の行にある可能性があります。

IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];

実行中のホストの最初のIPを取得します。これは、IPv6またはローカルホストアドレスである可能性があります。特定のアドレスでリッスンしたい場合は、プロジェクト設定に追加することをお勧めします。app.configに保存され、再コンパイルせずに変更できます。

于 2013-03-21T10:44:45.950 に答える