Отправка данных на 127. *: недоступный хост - PullRequest
2 голосов
/ 11 апреля 2011

Я пытаюсь отправить в адресное пространство обратной петли в приложении .NET 3.5, работающем в Windows XP.Код делает просто:

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и на моей тестовой машине нет брандмауэра

Я замечаю на XP, когда я пинг 127.0.0.2, ответы возвращаются:

Reply from 127.0.0.1

ВклВ Windows 7 ответ приходит с адреса, на который я отправил пинг:

Reply from 127.0.0.2

Я думаю, что это может быть проблемой, и поэтому проблема не в программировании, а в самой XP..

- Дан

Ответы [ 4 ]

1 голос
/ 11 апреля 2011

Работает ли с 127.0.0.1? В RFC указано:

127.0.0.0/8 - этот блок назначен для использования в качестве петлевого адреса узла Интернета.Датаграмма, отправленная протоколом более высокого уровня на адрес в любом месте этого блока, должна вернуться обратно в хост.Обычно это реализуется с использованием только 127.0.0.1/32 для обратной связи, но никакие адреса в этом блоке никогда не должны появляться ни в одной сети где-либо [RFC1700, стр. 5] .

Это, кажется, указывает на то, что вы не должны полагаться на 127.0.0.2 работу, если вы специально не настроили что-то.

1 голос
/ 12 апреля 2011

Я исправил проблему, выполнив шаги, упомянутые в ответе на этот пост:

Как создать виртуальный сетевой интерфейс в 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 уже использовался для других вещей, поэтому он работал нормально. Не совсем то, что я хотел, потому что мне придется добавить 2 петлевых адаптера на ПК пользователя - но он выполняет свою работу.

- Dan

0 голосов
/ 29 апреля 2014

В 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);
    }
0 голосов
/ 11 апреля 2011

Есть ли у вас сервер, прослушивающий порт 8000 по адресу 127.0.0.2 (который отличается от localhost, несмотря на то, что это петля)? Если нет, он не подключится, потому что ничего не слушает. Я подозреваю, что на вашей Win7 коробке что-то слушает.

netstat -b -n -a

должен показать вам, что.

EDIT

Я подозреваю, что вы используете XP SP2:

http://support.microsoft.com/kb/884020 (исправление доступно)

IIRC они устранили эту проблему с помощью SP3

...