我想用vb来获取当前机算机的公网IP,但是如果这台计算机在内网的话,那么我用vb获取的总是内网的192.168.x.x或10.0.0.x之类的内网IP,请问有什么方法可以获取内网计算机的公网IP(也许应该是获取内网计算机的网关IP地址吧)。
请高手附源码赐教!!!

解决方案 »

  1.   

    你的内网IP好象会被你的路由器映射成一个端口号,而真正的公网IP应该是路由器IP,路由器将根据那个端口号找到你的计算机.只知道这么多,见谅!
      

  2.   


    看看这个行不行
    Dim urlstr As String
    urlstr = Inet1.OpenURL("http://www.bliao.com:2000/ip.phtml")
      

  3.   

    用这个就可以了http://www.refound.net/download/soft.asp?id=24
      

  4.   

    就是通过系统 API 来获取的。
      

  5.   

    ////////////////////////////////////////////////////////////////////////////////////////
    //用途:枚举本地网络适配器信息
    //参数:FirstEnum=1,开始枚举;如果返回TRUE,应该将这个参数置0,继续枚举直到返回FALSE
    //     Reserve=保留
    //返回:成功返回TRUE,
    //     属性AdapterName包含一个枚举出的网络适配器的名称,
    //     属性AdapterType包含一个枚举出的网络适配器的类型,
    //     属性AdapterIPAddress包含一个枚举出的网络适配器的IP地址,     
    //     属性AdapterPhyAddress包含一个枚举出的网络适配器的物理地址,
    //     属性AdapterDescription包含一个枚举出的网络适配器的描述,
    //     这个时候应该使用第一个参数为0的该方法继续枚举,直到返回FALSE;
    //     没有新的适配器信息或方法失败返回FALSE.
    BOOL CCommunication::EnumAdapter(long FirstEnum, LPCTSTR Reserve) 
    {
    // TODO: Add your dispatch handler code here
    ULONG    ulOutput;
    DWORD    dRet; strLastError=""; strAdapterName="";
    strAdapterType="";
    strAdapterIPAddress="";
    strAdapterPhyAddress="";
    strAdapterDescription="";

    if(FirstEnum==1)                                        //第1次调用
    {
    ulOutput=sizeof(pIpAdapter);

    dRet=GetAdaptersInfo(pIpAdapter,&ulOutput);         //获得存放信息需要的内存尺寸
    switch(dRet)
    {
    case ERROR_NOT_SUPPORTED:
    strLastError="操作系统不支持这个方法";
    return FALSE;
    case ERROR_BUFFER_OVERFLOW:
    break;
    case ERROR_NO_DATA:
    strLastError="没有检测到本地安装了网络适配器";
    return FALSE;
    default:
    strLastError="未知错误导致失败";
    return FALSE;
    }

    hMem=(CHAR *)GlobalAlloc(GMEM_FIXED,ulOutput);
    if(hMem==NULL)
    {
    strLastError="分配内存失败";
    return FALSE;
    }

    dRet=GetAdaptersInfo((IP_ADAPTER_INFO *)hMem,&ulOutput);   //获得实际的信息
    if(dRet!=ERROR_SUCCESS)
    {
    GlobalFree((HANDLE)hMem);
    hMem=NULL;
    strLastError="异常情况导致失败";
    return FALSE;
    }

    pIpAdapter=(IP_ADAPTER_INFO *)hMem;                        //指向适配器信息结构链表头
    pIpAddressList=&(pIpAdapter->IpAddressList);               //指向第1个适配器信息结构的IP地址结构链表头
    }
    else                                                           //不是第1次枚举 
    {
    if(pIpAdapter==NULL)                                       
    {
    strLastError="第1次调用这个方法应该将第1个参数置1";
    return FALSE;
    } if(pIpAddressList->Next!=NULL)                             //当前适配器信息结构链表中IP地址结构链表是否存在下一个链 
    pIpAddressList=pIpAddressList->Next;                   //指向下一个IP
    else if(pIpAdapter->Next!=NULL)                            //是否存在下一个适配器信息结构链表 
    {
    pIpAdapter=pIpAdapter->Next;                           //指向下一个适配器信息结构链表
    pIpAddressList=&(pIpAdapter->IpAddressList);           //指向这个适配器信息结构的IP地址结构链表头
    }
    else                                                       //枚举结束,释放资源
    {
    pIpAdapter=NULL;
    pIpAddressList=NULL;
    GlobalFree((HANDLE)hMem);
    hMem=NULL;
    return FALSE;
    }
    }

    //IP地址
    strAdapterIPAddress=pIpAddressList->IpAddress.String; //名称
    strAdapterName=pIpAdapter->AdapterName;

    CHAR cBuff[MAX_ADAPTER_ADDRESS_LENGTH+1];
    INT I;

    //物理地址
    for(I=0;I<MAX_ADAPTER_ADDRESS_LENGTH;I++)
    {
    wsprintf(cBuff,"%02X",pIpAdapter->Address[I]);
    strAdapterPhyAddress+=cBuff;
    } //描述
    strAdapterDescription=pIpAdapter->Description; //类型
    switch(pIpAdapter->Type)
    {
    case MIB_IF_TYPE_ETHERNET:
    strAdapterType="以太网适配器";
    break;
    case MIB_IF_TYPE_FDDI:
    strAdapterType="光纤分布数据接口适配器";
    break;
    case MIB_IF_TYPE_LOOPBACK:
            strAdapterType="LOOPBACK适配器";
    break;
    case MIB_IF_TYPE_OTHER:
            strAdapterType="其他类型适配器";
    break;
    case MIB_IF_TYPE_PPP:
    strAdapterType="点到点协议适配器";
    break;
    case MIB_IF_TYPE_SLIP:
    strAdapterType="SLIP适配器";
    break;
    case MIB_IF_TYPE_TOKENRING:
    strAdapterType="令牌环适配器";
    break;
    }

    return TRUE;
    }
      

  6.   

    如果有外网IP,就会有外网MAC和他对应
      

  7.   

    是VC++,但道理是一样的,把他化成API吧
      

  8.   

    这个问题很好,大概想问,两个局局域网的机器,都联了公网,它们之间怎么通令,既使通过一台中传服务器,
    A网中a机通过中传服务器 61.189.56.137 如何与B网中B机通信...