我在局域网中的IP为 192.168.0.4 网关是192.168.0.1 但是我不知道这个局域网在公网中的地址 因为我需要和公网上的另一个主机通信 所以需要知道自己所在网段在公网的IP
请问怎么得到?

解决方案 »

  1.   

    try..HttpListenerRequest.UserHostAddress orHttpRequest.UserHostAddress
      

  2.   

    其实是这样的 我的主机只负责得到自己的网段的IP地址 并没有一个已经在公网的IP地址已知的主机可以协助我  用httpRequest需要和一个已知ip的主机通信才可以
      

  3.   

    vs2005的话可以试试
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
    ipaddr=host.AddressList[0].ToString();
    如果不是host.AddressList[0].ToString();就试试host.AddressList[1].ToString();
    再不行就试试host.AddressList[2].ToString();到2估计就差不多可以得到结果了
      

  4.   

    创建一个WebService ReturnClientIP 
    [WebMethod]
    public string GetClientIp()
    {
        return HttpContext.Current.Request.UserHostAddress;
    }
    客户端调用这个WebService中的GetClientIp方法
    string url = "http://www.xxx.com/ReturnClientIP.asmx";
    string IpAddress = WebService.InvokeWebService(url,"GetClientIp",null).ToString();//动态调用WebService
    using System;
    using System.IO;
    using System.Net;
    using System.Reflection;
    using System.CodeDom;
    using System.Diagnostics;
    using System.Web.Services;
    using System.Web.Services.Description;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;namespace GetClientIP
    {
    /// <summary>
    /// WebService 的摘要说明。
    /// </summary>
    public class WebService
    {
    public WebService()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } /// <summary>
    /// 动态调用web服务
    /// </summary>
    /// <param name="url">web服务地址</param>
    /// <param name="methodname">方法名</param>
    /// <returns></returns>
    public static object InvokeWebService(string url,string methodname)
    {
    return InvokeWebService(url,methodname,null) ;
    } /// <summary>
    /// 动态调用web服务
    /// </summary>
    /// <param name="url">web服务地址</param>
    /// <param name="methodname">方法名</param>
    /// <param name="args">参数数组</param>
    /// <returns></returns>
    public static object InvokeWebService(string url,string methodname,object[] args)
    {
    return InvokeWebService(url ,null,methodname,args) ;
    } /// <summary>
    /// 动态调用web服务
    /// </summary>
    /// <param name="url">web服务地址</param>
    /// <param name="classname">类名</param>
    /// <param name="methodname">方法名</param>
    /// <param name="args">参数数组</param>
    /// <returns></returns>
    public static object InvokeWebService(string url,string classname,string methodname,object[] args)
    {
    string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ;
    if((classname == null) ||(classname == ""))
    {
    classname = GetWsClassName(url) ;
    } try
    {
    //获取WSDL
    WebClient wc                   = new WebClient();
    Stream stream                  = wc.OpenRead(url+"?WSDL");
    ServiceDescription sd          = ServiceDescription.Read(stream);
    ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
    sdi.AddServiceDescription(sd,"","");
    CodeNamespace cn                = new CodeNamespace(@namespace);
                    
    //生成客户端代理类代码
    CodeCompileUnit ccu             = new CodeCompileUnit();
    ccu.Namespaces.Add(cn);
    sdi.Import(cn ,ccu); 
    CSharpCodeProvider csc          = new CSharpCodeProvider();
    ICodeCompiler icc               = csc.CreateCompiler();
                    
    //设定编译参数
    CompilerParameters cplist       = new CompilerParameters();
    cplist.GenerateExecutable       = false;
    cplist.GenerateInMemory         = true;
    cplist.ReferencedAssemblies.Add("System.dll");
    cplist.ReferencedAssemblies.Add("System.XML.dll");
    cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
    cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类
    CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
    if(true == cr.Errors.HasErrors)
    {
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
    {
    sb.Append(ce.ToString());
    sb.Append(System.Environment.NewLine);
    }
    throw new Exception(sb.ToString());
    } //生成代理实例,并调用方法
    System.Reflection.Assembly assembly = cr.CompiledAssembly;
    Type t = assembly.GetType(@namespace+"."+classname,true,true);
    object obj = Activator.CreateInstance(t);
    System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args);
    }
    catch(Exception ex)
    {
    throw new Exception(ex.InnerException.Message,new Exception(ex.InnerException.StackTrace));
    }
    } /// <summary>
    /// 获取类名
    /// </summary>
    /// <param name="wsUrl">web服务地址</param>
    /// <returns></returns>
    private static string GetWsClassName(string wsUrl)
    {
    string[] parts = wsUrl.Split('/') ;
    string[] pps   = parts[parts.Length-1].Split('.') ; return pps[0] ;
    }
    }
    }
      

  5.   

    我觉得一般情况下很难。外网上有一些网页可以测试wan口的ip的,试着去和这些网页通信,然后对获得页面分析,把ip地址提取出来
      

  6.   

    xiaotupansy(中) ( ) 信誉:100    Blog 
    ///////////////////////////////////////
    说的方法肯定不对 这样只能得到1个IP地址 我用2005
      

  7.   

    TO:其实是这样的 我的主机只负责得到自己的网段的IP地址 并没有一个已经在公网的IP地址已知的主机可以协助我  用httpRequest需要和一个已知ip的主机通信才可以你不是和公网上的另一个主机进行通信吗?你自己知道你自己的IP地址有什么用?应该是在另一主机得到你的地址并加以利用吧...
      

  8.   

    我觉得还是得和web服务器进行通信...直接得到似乎不行...关注下..
      

  9.   

    肯定要通过外部网站,或者是调用webservice 才行啊.你可以参考这个
    http://hi.baidu.com/jiangzhe/blog/item/e16fd83f8ba52fc27c1e717c.html