我想用vb来获取当前机算机的公网IP,但是如果这台计算机在内网的话,那么我用vb获取的总是内网的192.168.x.x或10.0.0.x之类的内网IP,请问有什么方法可以获取内网计算机的公网IP(也许应该是获取内网计算机的网关IP地址吧)。
请高手附源码赐教!!!
请高手附源码赐教!!!
解决方案 »
- 太高明了,从100个数字中按照随机顺序遍历,不会重复选择,不用判断语句,偶看了足足10分钟才想明白,太高明了,当浮一大白,散分!!
- 编码问题
- ReadProcessMemory支持自定义结构,吗?
- 如何让ComboBox控件响应MouseDownMouseUp 事件
- 用應用程式註冊 DLL文檔~!
- 关于使用Inet设计Ftp上传功能
- 各位大侠,请指教一下
- 急!vb如何处理声音信号?
- ***********请问VB如何打开并访问Notes数据库**************
- 关于文本框的LostFocus事件,请有兴趣的朋友帮忙看一下
- installshield做完安装无法安装在个别机器上 怎么办 在线等
- vb的串口控件在处理串口事件时,是否会被timer控件产生的事件中断?
看看这个行不行
Dim urlstr As String
urlstr = Inet1.OpenURL("http://www.bliao.com:2000/ip.phtml")
//用途:枚举本地网络适配器信息
//参数: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;
}
A网中a机通过中传服务器 61.189.56.137 如何与B网中B机通信...