Получить внешний IP-адрес через удаленное взаимодействие в C # - PullRequest
19 голосов
/ 16 сентября 2008

Мне нужно выяснить внешний 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 обратно клиенту.

Ответы [ 12 ]

0 голосов
/ 16 сентября 2008

Самый надежный способ сделать это - проверить сайт, подобный http://checkip.dyndns.org/ или подобному, потому что пока вы фактически не выйдете за пределы своей сети, вы не сможете найти свой внешний IP. Однако жесткое кодирование такого URL требует возможного сбоя. Вы можете выполнить эту проверку только в том случае, если текущий IP-адрес выглядит как RFC1918 частный адрес (192.168.x.x является наиболее знакомым из них.

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

0 голосов
/ 16 сентября 2008

Вы можете в основном проанализировать возвращенную страницу, выполнив WebRequest с http://whatismyipaddress.com

http://www.dreamincode.net/forums/showtopic24692.htm

...