当前位置:  开发笔记 > 编程语言 > 正文

在C#中通过远程处理获取外部IP地址

如何解决《在C#中通过远程处理获取外部IP地址》经验,为你挑选了4个好方法。

我需要找出运行C#应用程序的计算机的外部 IP.

在应用程序中,我有一个连接(通过.NET远程处理)到服务器.有没有一种很好的方法来获取服务器端的客户端地址?

(我已经编辑了这个问题,要更清楚一些.我向所有那些尽力回答这个问题的人道歉,当时我可能有点太模糊了)

解决方案:
我发现了一种对我有用的方法.通过实现我可以访问CommonTransportKeys.IPAddress的自定义IServerChannelSinkProvider和IServerChannelSink,可以很容易地在CallContext上添加客户端ip.

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;
}

然后(当我从客户端收到请求时)只需从CallContext获取IP就像这样.

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发送回客户端.



1> Nathan Stron..:

这是你需要深入研究并重新考虑原始问题的问题之一; 在这种情况下,"为什么需要外部IP地址?"

问题是计算机可能没有外部IP地址.例如,我的笔记本电脑有一个由路由器分配的内部IP地址(192.168.xy).路由器本身具有内部IP地址,但其"外部"IP地址也是内部的.它仅用于与DSL调制解调器通信,DSL调制解调器实际上具有面向互联网的外部IP地址.

因此,真正的问题是,"如何让设备的面向Internet的IP地址跳跃2?" 答案通常是,你没有; 至少没有使用像你已经被解雇的whatismyip.com这样的服务,或者做一个非常大的黑客攻击,包括将DSL调制解调器密码硬编码到你的应用程序中,查询DSL调制解调器和屏幕抓取管理页面(上帝帮助你如果调制解调器被更换).

编辑:现在将此应用于重构的问题,"如何从服务器.NET组件获取我的客户端的IP地址?" 与whatismyip.com一样,服务器能够做的最好的事情是为您提供面向Internet的设备的IP地址,这不太可能是运行该应用程序的计算机的实际IP地址.回到我的笔记本电脑,如果我的面向Internet的IP是75.75.75.75并且LAN IP是192.168.0.112,那么服务器将只能看到75.75.75.75的IP地址.这将是我的DSL调制解调器.如果您的服务器想要单独连接到我的笔记本电脑,我首先需要配置DSL调制解调器和它与我的笔记本电脑之间的任何路由器,以识别来自服务器的传入连接并适当地路由它们.有几种方法可以做到这一点,但它'

如果您实际上是尝试从服务器连接到客户端,请重新考虑您的设计,因为您正在深入研究WTF领域(或者至少,使您的应用程序更难部署).



2> FlySwat..:

Dns.GetHostEntry(Dns.GetHostName()); 将返回一组IP地址.第一个应该是外部IP,其余的将是NAT背后的IP.

所以:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());
string externalIP = IPHost.AddressList[0].ToString();

编辑:

据报道,这对某些人不起作用.它对我有用,但可能取决于您的网络配置,它可能无法正常工作.



3> UnkwnTech..:

最好只使用http://www.whatismyip.com/automation/n09230945.asp它只输出IP用于自动查找.

如果你想要一些不依赖别人的东西你自己的页面http://www.unkwndesign.com/ip.php只是一个快速的脚本:


这里唯一的缺点是它只会检索用于创建请求的接口的外部IP.



4> Patrik Svens..:

我找到了一种对我有用的方法。通过实现可访问CommonTransportKeys.IPAddress的自定义IServerChannelSinkProvider和IServerChannelSink,可以轻松地在CallContext上添加客户端ip。

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;
}

然后,稍后(当我从客户端收到请求时)只需像这样从CallContext中获取IP。

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发送回客户端。

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有