2

我正在尝试发送到在 Windows XP 上运行的 .NET 3.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,我的测试机器上没有防火墙

当我 ping 127.0.0.2 时,我在 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- 该块被分配用作 Internet 主机环回地址。由更高级别协议发送到该块内任何地址的数据报应在主机内部循环。这通常仅使用127.0.0.1/32for loopback 来实现,但此块内的任何地址都不应该出现在任何地方的任何网络上[RFC1700, page 5]

这似乎表明你不应该依赖127.0.0.2工作,除非你专门设置了一些东西。

于 2011-04-11T17:33:57.153 回答
1

我按照这篇文章的答案中提到的步骤解决了这个问题:

如何在 Windows 上创建虚拟网络接口?

问题的最初原因是我需要在两个程序之间发送数据:

  • 过程 A:必须在端口 1234 上发送/接收(我无法更改/重构)
  • 进程 B:必须从进程 A 发送/接收,但必须使用不同的接口,因为最终它必须使用端口 1234。

由于我最初使用 127.* 地址块的计划在 XP 上无法正常工作,因此我选择了虚拟网络接口方法。我创建了两个虚拟网络接口:

  • 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(尽管是环回,但与 localhost 不同)?如果没有,它将无法连接,因为没有任何东西在听。我怀疑在你的 Win7 盒子上,有东西在听。

netstat -b -n -a

应该告诉你什么。

编辑

我怀疑您正在运行 XP SP2:

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 回答