Мне нужно выяснить внешний IP-адрес компьютера, на котором запущено приложение C #.
В приложении у меня есть подключение (через .NET Remoting) к серверу. Есть ли хороший способ получить адрес клиента на стороне сервера?
(Я отредактировал вопрос, чтобы быть немного более ясным. Я извиняюсь перед всеми добрыми людьми, которые приложили все усилия, чтобы ответить на вопрос, когда я, возможно, был немного слишком расплывчатым)
Решение:
Я нашел способ, который работал отлично для меня. Благодаря реализации пользовательских IServerChannelSinkProvider и IServerChannelSink, где у меня есть доступ к CommonTransportKeys.IPAddress, легко добавить клиентский ip в CallContext.
public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
IMessage requestmessage, ITransportHeaders requestHeaders,
System.IO.Stream requestStream, out IMessage responseMessage,
out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
try
{
// Get the IP address and add it to the call context.
IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
CallContext.SetData("ClientIP", ipAddr);
}
catch (Exception)
{
}
sinkStack.Push(this, null);
ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
requestStream, out responseMessage, out responseHeaders, out responseStream);
return srvProc;
}
А потом (когда я получаю запрос от клиента) просто получите IP-адрес из CallContext следующим образом.
public string GetClientIP()
{
// Get the client IP from the call context.
object data = CallContext.GetData("ClientIP");
// If the data is null or not a string, then return an empty string.
if (data == null || !(data is IPAddress))
return string.Empty;
// Return the data as a string.
return ((IPAddress)data).ToString();
}
Теперь я могу отправить IP обратно клиенту.