C # Socket.LocalEndPoint возвращает 0.0.0.0 на некоторых машинах - PullRequest
0 голосов
/ 20 мая 2009

Почему 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

Адаптер Ethernet Подключение по локальной сети 2:

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

Адаптер Ethernet Подключение по локальной сети:

    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 Будет IP-адрес, который я ожидаю в результате.

Ответы [ 4 ]

2 голосов
/ 03 июня 2009

Я думаю, что вы получаете правильные результаты для локальной конечной точки на вашем сокете, из того, что я тестировал, это в основном ip по умолчанию, так как "0.0.0.0" в основном говорит сокету прослушивать все сетевые адаптеры, если вы слушаете с этот сокет. свойство IPEndpoint.Any в основном равно ip «0.0.0.0».

Я думаю, что вы получаете локальный ip с помощью netstat, поскольку вы разрешаете его этим способом.

1 голос
/ 21 мая 2009

ОК решил использовать обходной путь. Проверено и работает. Может кто-нибудь придумать причину, по которой такой способ может не дать точный 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
0 голосов
/ 23 сентября 2009

мы проверили его сейчас, и IP 0.0.0.0 возвращается, когда команда командной строки Windows "ipconfig -all" возвращает в первую очередь Адаптер, который отключен .

Если вы «закрыли / остановили» (я не знаю, какое слово на английском это точно, у меня нет английской Windows) адаптера, вы увидите, что он возвращает правильный IP.

0 голосов
/ 20 мая 2009

Попробуйте использовать ((IPEndPoint) s.LocalEndPoint) .ToString ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...