C#Socket.LocalEndPoint在某些机器上返回0.0.0.0

时间:2009-05-20 16:17:44

标签: c# sockets

为什么LocalEndpoint = 0.0.0.0此时?根据文档,它应该是系统选择的适当地址。注意:这仅在某些机器上出现。大多数机器都会返回我期望的IP地址。这是.NET中的错误吗?

using (Socket s = new Socket(AddressFamily.InterNetwork, 
   SocketType.Stream, ProtocolType.Tcp))
   {
       Console.WriteLine("Connecting");
       s.Connect("www.google.com", 80);
       Console.WriteLine("Connected OK");
       s.Send(new byte[] { 1 });
       Console.WriteLine("Sent Byte OK");
       Console.WriteLine("Local EndPoint = " + 
       s.LocalEndPoint.ToString());
    }
    //Local EndPoint = 0.0.0.0

我也尝试过做

s.Bind(new IPEndPoint(IPAddress.Any, 0));
创建套接字后直接

没有区别。 “问题”机器始终返回0.0.0.0。

这是ipconfig / all

的结果
Windows IP Configuration

    Host Name . . . . . . . . . . . . : andrepc
    Primary Dns Suffix  . . . . . . . : 
    Node Type . . . . . . . . . . . . : Unknown
    IP Routing Enabled. . . . . . . . : No
    WINS Proxy Enabled. . . . . . . . : No

以太网适配器本地连接2:

    Media State . . . . . . . . . . . : Media disconnected
    Description . . . . . . . . . . . : VIA VT6105 Rhine Fast Ethernet Adapter
    Physical Address. . . . . . . . . : 00-30-18-67-A0-EB

以太网适配器本地连接:

    Connection-specific DNS Suffix  . : 
    Description . . . . . . . . . . . : Realtek RTL8029 PCI Ethernet Adapter
    Physical Address. . . . . . . . . : 00-C0-DF-E7-C9-5D
    Dhcp Enabled. . . . . . . . . . . : Yes
    Autoconfiguration Enabled . . . . : Yes
    IP Address. . . . . . . . . . . . : 10.0.0.6
    Subnet Mask . . . . . . . . . . . : 255.0.0.0
    Default Gateway . . . . . . . . . : 10.0.0.2
    DHCP Server . . . . . . . . . . . : 10.0.0.2
    DNS Servers . . . . . . . . . . . : 10.0.0.2
    Lease Obtained. . . . . . . . . . : Wednesday, May 20, 2009 5:39:06 PM
    Lease Expires . . . . . . . . . . : Thursday, May 21, 2009 5:39:06 PM

10.0.0.6这将是我期望的结果。

4 个答案:

答案 0 :(得分:2)

我认为你正在获得套接字上本地端点的正确结果,从我测试的,这基本上是默认的IP,因为“0.0.0.0”基本上告诉套接字听取所有网络适配器,如果你听那个插座。 IPEndpoint.Any属性基本上等于ip为“0.0.0.0”。

我认为您使用netstat获取本地IP,因为您正在使用该方法解析它。

答案 1 :(得分:1)

好的决定使用解决方法。经过测试和工作。任何人都可以想到为什么这样做可能无法提供准确的IP /端口?

static void Main(string[] args)
{
    try
    {
        using (Socket s = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, ProtocolType.Tcp))
        {
            Console.WriteLine("Connecting");
            s.Connect("www.google.com", 80);
            Console.WriteLine("Connected OK");
            s.Send(new byte[] { 1 });
            Console.WriteLine("Sent Byte OK");
            Console.WriteLine("Local EndPoint Netstat       = " + 
                GetLocalEndPoint(s));
            Console.WriteLine("Local EndPoint LocalEndPoint = " + 
                ((IPEndPoint)s.LocalEndPoint).ToString());
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception - " + e.Message);
    }
}

static string GetLocalEndPoint(Socket s)
{
    Console.WriteLine(DateTime.Now.TimeOfDay.ToString() + 
        " Find IP LocalEndPoint");

    IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();
    TcpConnectionInformation[] connections = 
        properties.GetActiveTcpConnections();
    IPEndPoint remoteEP = (IPEndPoint)s.RemoteEndPoint;
    foreach (TcpConnectionInformation netstat in connections)
    {
        if (remoteEP.ToString() == netstat.RemoteEndPoint.ToString())
        {
            Console.WriteLine(DateTime.Now.TimeOfDay.ToString() + 
                " Find IP LocalEndPoint OK");
            //Use the "Netstat" IP but the socket.LocalEndPoint port
            return new IPEndPoint(netstat.LocalEndPoint.Address, 
                ((IPEndPoint)s.LocalEndPoint).Port).ToString();
        }
    }
    return string.Empty;
}

Connecting
Connected OK
Sent Byte OK
09:57:38.5312500 Find IP LocalEndPoint
09:57:38.5312500 Find IP LocalEndPoint OK
Local EndPoint Netstat       = 10.0.0.6:1711
Local EndPoint LocalEndPoint = 0.0.0.0:1711

答案 2 :(得分:0)

我们现在进行了测试,当“ipconfig -all”windows命令行命令在第一个位置返回时,返回IP 0.0.0.0 已断开连接

如果你“关闭/停止”(我不知道英文中究竟是什么单词,我没有英文Windows)适配器,你会看到它返回正确的IP。

答案 3 :(得分:0)

尝试使用((IPEndPoint)s.LocalEndPoint).ToString());