Не удается подключиться к удаленному серверу при выборе IpEndPoint

У меня есть код С#, работающий на компьютере с несколькими IP-адресами, и у меня есть следующий код для выбора IP-адреса для httpWebRequest:

class Interact
{
    <data, cookies, etc>

    HttpWebRequest CreateWebRequest(...)
    {
        .....

            request.ServicePoint.BindIPEndPointDelegate = delegate(
            ServicePoint servicePoint,
            IPEndPoint remoteEndPoint,
            int retryCount)
                      {
                          if (lastIpEndpoint!=null)
                          {
                              return lastIpEndpoint;
                          }
                          var candidates =
                              GetAddresses(remoteEndPoint.AddressFamily);
                          if (candidates==null||candidates.Count()==0)
                          {
                              throw new NotImplementedException();
                          }

                          return
                              lastIpEndpoint = new IPEndPoint(candidates[rnd.Next(candidates.Count())],0);
                      };
            };

        return request;
    } 
}

Вот код GetAddresses:

    static IPAddress[] GetAddresses(AddressFamily af)
    {
        System.Net.IPHostEntry _IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
        return (from i in _IPHostEntry.AddressList where i.AddressFamily == af select i).ToArray();
    }

Предполагается, что этот код выбирает случайный IP-адрес из доступного списка IP-адресов, а затем придерживается его.

Вместо этого каждый раз, когда я отправляю запрос с ним, я получаю следующее исключение:

Unable to connect to the remote server

Как мне заставить это работать?


person Arsen Zahray    schedule 09.07.2012    source источник


Ответы (1)


Похоже, вы устанавливаете номер порта конечной точки на ноль в строке:

lastIpEndpoint = new IPEndPoint(candidates[rnd.Next(candidates.Count())],0); 

Если это не будет изменено позже, маловероятно, что вы сможете подключиться к HTTP-серверу через порт 0. Возможно, вы сможете использовать порт, содержащийся в remoteEndPoint, или, возможно, вы можете жестко запрограммировать номер порта, если он общеизвестно (например, 80 для HTTP-сервера, работающего на порту по умолчанию).

lastIpEndpoint = new IPEndPoint(candidates[rnd.Next(candidates.Count())], remoteEndPoint.Port); 
person Monroe Thomas    schedule 09.07.2012
comment
На самом деле, это не совсем работает. Я попробовал предложенное решение, и я все еще получаю Невозможно подключиться к удаленному серверу ---> System.Net.Sockets.SocketException: запрошенный адрес недействителен в своем контексте 173.194.39.68:80 (я' проверяю это в гугле) - person Arsen Zahray; 13.07.2012
comment
@ArsenZahray, что вы использовали для номера порта? Вы жестко кодировали 80 или использовали remoteEndPoint.Port? - person Monroe Thomas; 13.07.2012
comment
@ArsenZahray Эта ошибка обычно означает, что IP-адрес не принадлежит машине, что заставляет меня чесать голову в данный момент, поскольку вы используете Dns.GetHostName(). - person Monroe Thomas; 13.07.2012
comment
@ArsenZahray Возможно, записи DNS / hosts на машине устарели, а это означает, что результаты GetHostEntry могут быть недействительными. Можете ли вы запустить ipconfig в командной строке на сервере, чтобы проверить фактические IP-адреса хост-адаптеров на вашем компьютере. Если ни один из них не является 173.194.39.68, проверьте, не переопределяет ли файл hosts (%SystemRoot%\system32\drivers\etc\hosts). - person Monroe Thomas; 13.07.2012
comment
Примечание. Согласно комментариям к коду System.Net.IPEndPoint.IPEndPoint, порт 0 позволяет выбрать любой доступный порт. // порт: // номер порта, связанный с адресом, или 0, чтобы указать любой доступный порт. // порт находится в порядке хоста. - person Zabbu; 24.10.2017