2

WindowsXPで実行されている.NET3.5アプリケーションのループバックアドレス空間に送信しようとしています。コードは単純です:

receiver = new IPEndPoint(IPAddress.Parse("127.0.0.2"), 8000);
sock.SendTo(data, len, SocketFlags.None, receiver);

コードを実行すると、到達不能なホストソケット例外が発生します。ループバックインターフェイスは常に存在し、到達不能なホスト例外を生成するべきではないため、これは私には奇妙に思えます。

Windows 7はコードを問題なく実行するため、問題はさらに奇妙になります。

つまり、XPでこれを機能させるためのヒントがあれば、ぜひ教えてください。

編集:

いくつかの情報:

  • 何かが127.0.0.2でリッスンしている、私のnetstatは次のことを示しています:
  • UDP 127.0.0.2:8000:5824 _

  • XP SP3を実行していますが、テストマシンにファイアウォールがありません

127.0.0.2にpingを実行すると、XPに気づき、応答が返されます。

Reply from 127.0.0.1

Windows 7では、pingしたアドレスから応答が返されます。

Reply from 127.0.0.2

これが問題になる可能性があると思います。そのため、実際にはプログラミングの問題ではなく、XP自体の問題です...

-ダン

4

4 に答える 4

1

で動作し127.0.0.1ますか? RFCは次のように述べています。

127.0.0.0/8- このブロックは、インターネット ホスト ループバック アドレスとして使用するために割り当てられます。上位レベルのプロトコルによってこのブロック内の任意のアドレスに送信されたデータグラムは、ホスト内でループバックする必要があります。これは通常127.0.0.1/32、for ループバックのみを使用して実装されますが、このブロック内のアドレスは、どこのネットワークにも表示されるべきではありません[RFC1700, page 5]

127.0.0.2これは、特に何かを設定しない限り、作業に頼るべきではないことを示しているようです。

于 2011-04-11T17:33:57.153 に答える
1

この投稿への回答に記載されている手順に従って、問題を修正しました。

Windows で仮想ネットワーク インターフェイスを作成するにはどうすればよいですか?

問題の元の原因は、2 つのプログラム間でデータを送信する必要があったことです。

  • プロセス A: ポート 1234 で送受信する必要があります (これを変更/リファクタリングすることはできません)
  • プロセス B: プロセス A から送受信する必要がありますが、最終的にはポート 1234 を使用する必要があるため、別のインターフェイスを使用する必要があります。

127.* アドレス ブロックを使用するという当初の計画は XP では正しく機能しなかったため、仮想ネットワーク インターフェイスのアプローチに落ち着きました。2 つの仮想ネットワーク インターフェイスを作成しました。

  • 172.17.1.1/255.255.0.0(プロセスA用)
  • 172.17.1.2/255.255.0.0(プロセスB用)

172.17 アドレス ブロックは既に他のものに使用されていたため、ここでは問題なく機能しました。ユーザーの PC に 2 つのループバック アダプターを追加する必要があるため、私が望んでいたものとはまったく異なりますが、これで作業は完了です。

――ダン

于 2011-04-12T01:44:20.090 に答える
0

アドレス127.0.0.2のポート8000​​でリッスンしているサーバーがありますか(ループバックであるにもかかわらず、ローカルホストとは異なります)?そうでない場合は、何も聞いていないため、接続されません。私はあなたのWin7ボックスに何か聞いているのではないかと思います。

netstat -b -n -a

あなたに何を表示する必要があります。

編集

XPSP2を実行していると思われます。

http://support.microsoft.com/kb/884020(修正可能)

IIRC彼らはSP3によってこの問題を取り除きました

于 2011-04-11T17:31:45.793 に答える
0

Windows 8.0 x64では、問題がまだ存在しているように見えることがあります...問題が存在するときはわかりませんが、そうでない場合は、新しく起動したWindowsでも表示されることがあります...「localhost」をその問題に解釈するようにプログラムを変更しましたローカル IP 4 アドレス。


    public static IPAddress GetConfiguredIPAddress()
    {
        string serverIPString = System.Configuration.ConfigurationManager.AppSettings["serverIP"];

        if (serverIPString.ToLower() == "localhost")
        {
            System.Net.IPHostEntry localhost = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
            foreach (var item in localhost.AddressList)
            {
                if (item.AddressFamily == AddressFamily.InterNetwork && item.GetAddressBytes()[0] != 127)
                {
                    return item;   
                }
            }
        }

        IPAddress result = null;
        if (IPAddress.TryParse(serverIPString, out result))
        {
            return result;
        }

        //I experienced problems with Upper Case DNS Names, so i change this here.
        //dont know if thats correct, because if its really that issue, 
        //it would have been implemented in the Dns class.
        //Note: This also resolves localhost to 127.0.0.1 if you are not connected to any network.
        IPAddress[] dnsAddresses = System.Net.Dns. GetHostAddresses(serverIPString.ToLower());

        if (dnsAddresses.Length > 0)
        {
            IPAddress foundIP4 = null;
            IPAddress foundOtherAddress = null; //usally ipv6

            foreach (IPAddress ip in dnsAddresses)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    foundIP4 = ip;
                }
                else
                {
                    foundOtherAddress = ip;
                }

            }
            if (foundIP4 != null)
            {
                return foundIP4;
            }
            return foundOtherAddress;
        }

        throw new InvalidOperationException("Unable to get IPAddress for " + serverIPString);
    }
于 2014-04-29T17:29:39.693 に答える