2014-11-12 3 views
1

У меня есть HttpListener, где я заинтересован в возможности видеть IP-адрес запрашивающих клиентов. Бонус также мог бы видеть DNS клиента, но я не уверен, как это будет возможно, поскольку, насколько я знаю, информация не отправляется с помощью HTTP?Получение запроса IP-адреса клиента на сервере

В любом случае, насколько я могу судить, я должен использовать для этого Request.UserHostAddress, но я просто получаю свой локальный IP-адрес. Что я здесь делаю неправильно?

Где я должен получить IP-адрес клиента.

 HttpListenerContext context = listener.EndGetContext(result); 
     string clientName = context.Request.UserHostAddress; 

Где я пишу на выходной сервер ListBox У меня есть:

 public static void TileString(int x, int y, int z, string dbName, string clientName) 
     { 
     int[] tileInts = { z, x, y }; 
     string tileString = string.Join("/", tileInts); 

     Application.Current.Dispatcher.Invoke(new Action(() => 
     { 
      var mainWindow = Application.Current.MainWindow as MainWindow; 
      mainWindow.AppendServerOutput("Delivering tile " + tileString + " in format [z, x, y]" + " from " + dbName + " to client " + clientName + "\n"); 
     })); 
     } 
+0

DNS-имя клиента - «context.Request.UserHostName;'. Но, похоже, вы написали правильный код. Имя clientName переписано? Что показано при добавлении 'Debug.WriteLine (« client is: »+ clientName),' после первого фрагмента кода (чтобы убедиться, что ничего не перезаписано)? – Sjips

+1

И что такое 'context.Request.RemoteEndPoint.ToString());' показывать ?; – Sjips

+0

@Sjips Использование RemoteEndPoint.ToString() показало мне именно то, что я хотел. Не могу поверить, что я пропустил это. Благодаря! – Left4Cookies

ответ

4

пытаются использовать:

string clientIP = context.Request.RemoteEndPoint.ToString()); 
+1

Уход за разъяснением вашего решения? – everton

+0

Если за прокси-сервером или переадресацией ip это будет часто прокси-адрес, а не адрес клиента –

1

Из документации MSDN для HttpListenerRequest.UserHostAddress собственности:

Получает IP-адрес и номер порта сервера на который направлен запрос.

Другими словами, это не адрес удаленной конечной точки. Это адрес сервера , который используется удаленной конечной точкой.

Как вы видели, вы можете использовать RemoteEndPoint для извлечения IP-адреса удаленной конечной точки.

Используйте метод System.Net.Dns.GetHostEntry() для выполнения обратных DNS-запросов (т. Е. Получить имя удаленного хоста для IP-адреса).

+0

При использовании 'RemoteEndPoint' я не могу просто сказать' string clientName = Dns.GetHostEntry (clientIp) .ToString(); ', чтобы получить доменное имя clientIp? Я просто получаю «Нет такого хоста» – Left4Cookies

+0

'IPHostEntry' не переопределяет' ToString() ', поэтому предположительно вы имеете в виду что-то другое (например, свойство HostName). Но в любом случае да ... это часто будет работать. Но нет, вы не можете предположить, что это будет всегда работать. Вы должны иметь дело с IP-адресом, о котором знает DNS-сервер. –

Смежные вопросы