
我们知道内网ip和外网ip可能不同,这涉及到“网络地址转换”(NAT)。
事实上,只有和公网联络才有可能获取外网ip地址,直接用winsock的localip属性,或者ipconfig之类的方法(在内外网ip不同的情况下)获取的都是内网ip!
获取外网ip可以用你说的ip138网页的方式,可以通过winsock、inet、xml>
家庭宽带上网,不会有固定的外网IP给你,电信公司是随机分配的。如果你总想在互联网上找到你的计算机,建议使用花生壳动态域名软件。它是免费的,而且很少断线。个人认为是最为的。
花生壳是完全免费的桌面式域名管理和动态域名解析(DDNS)等功能为一体的客户端软件。花生壳客户端向用户提供全方位的桌面式域名管理以及动态域名解析服务。用户无需通过IE浏览器,直接通过客户端使用>>
接口地址: >
function real_server_ip(){
static $serverip = NULL;
if ($serverip !== NULL){
return $serverip;
}
if (isset($_SERVER)){
if (isset($_SERVER['SERVER_ADDR'])){
$serverip = $_SERVER['SERVER_ADDR'];
}
else{
$serverip = '0000';
}
}
else{
$serverip = getenv('SERVER_ADDR');
}
return $serverip;
}
using System;
using SystemRuntimeInteropServices ;
using SystemCollectionsGeneric ;
using SystemNet ;
using SystemNetSockets ;
using SystemIO ;
using ESBasicHelpers ;
using ESBasicNetworkTcp;
namespace ESBasicNetwork
{
/// <summary>
/// NetHelper 。
/// </summary>
public static class NetHelper
{
#region IsPublicIPAddress
public static bool IsPublicIPAddress(string ip)
{
if(ipStartsWith("10")) //A类 10000到10255255255255
{
return false ;
}
if(ipStartsWith("172"))//B类 1721600到17231255255
{
if(ipSubstring(6 ,1) == "")
{
int secPart = intParse(ipSubstring(4 ,2)) ;
if((16 <= secPart) && (secPart <= 31) )
{
return false ;
}
}
}
if(ipStartsWith("192168"))//C类 19216800到192168255255
{
return false ;
}
return true ;
}
#endregion
#region ReceiveData
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(NetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelperReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(NetworkStream stream ,byte[] buff ,int offset ,int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = streamRead(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据
/// </summary>
public static byte[] ReceiveData(ISafeNetworkStream stream ,int size)
{
byte[] result = new byte[size] ;
NetHelperReceiveData(stream ,result ,0 ,size) ;
return result ;
}
/// <summary>
/// ReceiveData 从网络读取指定长度的数据 ,存放在buff中offset处
/// </summary>
public static void ReceiveData(ISafeNetworkStream stream, byte[] buff, int offset, int size)
{
int readCount = 0 ;
int totalCount = 0 ;
int curOffset = offset ;
while(totalCount < size)
{
int exceptSize = size - totalCount ;
readCount = streamRead(buff ,curOffset ,exceptSize) ;
if(readCount == 0)
{
throw new IOException("NetworkStream Interruptted !") ;
}
curOffset += readCount ;
totalCount += readCount ;
}
}
#endregion
#region GetRemotingHanler
//前提是已经注册了remoting通道
public static object GetRemotingHanler(string channelTypeStr ,string ip ,int port ,string remotingServiceName ,Type destInterfaceType)
{
try
{
string remoteObjUri = stringFormat("{0}://{1}:{2}/{3}" ,channelTypeStr ,ip ,port ,remotingServiceName) ;
return ActivatorGetObject(destInterfaceType ,remoteObjUri);
}
catch
{
return null ;
}
}
#endregion
#region GetLocalIp
/// <summary>
/// GetLocalIp 获取本机的IP地址
/// </summary>
public static IPAddress[] GetLocalIp()
{
string hostName = DnsGetHostName() ;
IPHostEntry hEntry = DnsResolve(hostName) ;
return hEntryAddressList ;
}
public static IPAddress GetFirstLocalIp()
{
string hostName = DnsGetHostName();
IPHostEntry hEntry = DnsResolve(hostName);
return hEntryAddressList[0];
}
/// <summary>
/// GetLocalPublicIp 获取本机的公网IP地址
/// </summary>
public static string GetLocalPublicIp()
{
IPAddress[] list = NetHelperGetLocalIp();
foreach(IPAddress ip in list)
{
if(NetHelperIsPublicIPAddress(ipToString()))
{
return ipToString() ;
}
}
return null ;
}
#endregion
#region IsConnectedToInternet
/// <summary>
/// IsConnectedToInternet 机器是否联网
/// </summary>
public static bool IsConnectedToInternet()
{
int Desc=0;
return InternetGetConnectedState(Desc,0);
}
[DllImport("wininetdll")]
private extern static bool InternetGetConnectedState(int Description,int ReservedValue);
#endregion
#region GetMacAddress 获取网卡mac地址
/// <summary>
/// GetMacAddress 获取本机所有网卡的Mac地址
/// </summary>
public static IList<string> GetMacAddress()
{
return MachineHelperGetMacAddress();
}
#endregion
#region DownLoadFileFromUrl
/// <summary>
/// DownLoadFileFromUrl 将url处的文件下载到本地
/// </summary>
public static void DownLoadFileFromUrl(string url ,string saveFilePath)
{
FileStream fstream = new FileStream(saveFilePath ,FileModeCreate ,FileAccessWrite);
WebRequest wRequest = WebRequestCreate(url);
try
{
WebResponse wResponse = wRequestGetResponse();
int contentLength =(int)wResponseContentLength;
byte[] buffer = new byte[1024];
int read_count = 0 ;
int total_read_count = 0 ;
bool complete = false;
while (!complete )
{
read_count = wResponseGetResponseStream()Read(buffer,0,bufferLength);
if(read_count > 0)
{
fstreamWrite(buffer ,0 ,read_count) ;
total_read_count += read_count ;
}
else
{
complete = true ;
}
}
fstreamFlush() ;
}
finally
{
fstreamClose() ;
wRequest = null;
}
}
#endregion
}
}
这个类直接拿去用吧,命名空间改一下,里面有你想要的方法以及一些可能对你有用的方法
当然可以实现,以下是通用版的啦不管是否路由上网,还是拨号上网,都可以!,代码如下:
@echo off
<"%~f0" more +6 >tmpvbs
cscript /nologo tmpvbs
pause
goto :eof
set >
C++取外网IP 源代码
#include <winsockh>
#include <stdioh>
WSAData wsaDat;
short int Port = 80;
WSAStartup(MAKEWORD(1,1),&wsaDat);
SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN sockAddr;
memset((void)&sockAddr,0,sizeof(sockAddr));
sockAddrsin_family=AF_INET;
sockAddrsin_port=htons(Port);
sockAddrsin_addrs_addr=inet_addr("221547132");
connect(sd,
(LPSOCKADDR)&sockAddr,
sizeof(sockAddr));
char sendstr[]="GET /ip2cityasp >
以上就是关于请问VB怎样获取本机外网动态的IP地址啊(不是通过访问ip138网页的方式获取)全部的内容,包括:请问VB怎样获取本机外网动态的IP地址啊(不是通过访问ip138网页的方式获取)、如何用DOS命令查看自己的ip外网地址、外网IP有固定的么如何获得。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)