一、获取计算机的IP地址和名称:
利用函数GetComputerName()
TheGetComputerNamefunction retrieves the NetBIOS name of the local computer. This name is established at system startup, when the system reads it from the registry.
BOOL GetComputerName( LPTSTRlpBuffer, LPDWORDlpnSize);
//获取计算机名称
TCHARch[20];
memset(ch,0,20*sizeof(TCHAR));
DWORDdw= 20;
GetComputerName(ch,&dw);
AfxMessageBox((CString)ch);
利用WinSock库也可以获取计算机的名称,但是首先必须得初始化WinSock库。
1.gethostname函数:
This function returns the standard host name for the local machine.
int gethostname(char FAR*name, intnamelen);
没有错误则返回0,有错误则返回SOCKET_ERROR,通过WSAGetLastError获取指定的错误代码
charname[20];
memset(name,0,sizeof(char)*20);
gethostname(name,20);
2.gethostbyname函数:从主机数据库中得到对应的主机的相应信息,如IP地址等。
This function retrieves host information corresponding to a host name from a host database.
struct hostent FAR* gethostbyname(const char FAR*name);//name是主机名字,一般是由gethostname获得的名字。
struct hostent {
char FAR*h_name;//正规的主机名字
char FAR* FAR*h_aliases;//一个以空指针结尾的可选主机名队列
shorth_addrtype;//返回地址类型
shorth_length;//每个地址的长度
char FAR* FAR*h_addr_list;};//空指针结尾的主机地址列表
//获取IP地址
//char name[] =“www.sina.com.cn”;
structhostent*p_HostEnt;
p_HostEnt=gethostbyname(name);
if(p_HostEnt!=NULL)
{
WCHARHostAddress[20];
wsprintf(HostAddress,_T("%d.%d.%d.%d"),(p_HostEnt->h_addr_list[0][0] & 0x00ff),
(p_HostEnt->h_addr_list[0][1] & 0x00ff),(p_HostEnt->h_addr_list[0][2] & 0x00ff),(p_HostEnt->h_addr_list[0][3] & 0x00ff));
AfxMessageBox((CString)HostAddress);
}
3.gethostbyaddr函数:从网络地址得到对应的主机。
This function retrieves the host information corresponding to a network address.
struct hostent FAR* gethostbyaddr(const char FAR*addr,intlen,inttype);
addr为地址,len为地址的长度,type为地址类型,AF_INET。
//根据地址来获取主机名字
charsin[] ="100.0.0.150";
DWORDdw=inet_addr(sin);//网络字节序
intlen=strlen(sin);
hostent*pHostEnt;
pHostEnt=gethostbyaddr((LPSTR)(&dw),len,AF_INET);
二、获取计算机子网掩码
用函数GetAdaptersInfo可以获取本地计算机的网络信息,从而获得该计算机的子网掩码。
DWORD GetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,PULONGpOutBufLen);
MSDN: This function retrieves adapter information for the local computer.
pAdapterInfo为指向IP_ADAPTER_INFO,此结构体包含了本地计算机上的一个特定网络适配卡的信息:
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO*Next;
DWORDComboIndex;
CharAdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//网卡名
charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//对网卡的描述
UINTAddressLength;//物理地址的长度
BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];//物理地址
DWORDIndex;//网卡索引号
UINTType;//网卡类型
UINTDhcpEnabled;//是否启用了DHCP动态IP分配
PIP_ADDR_STRINGCurrentIpAddress;//当前使用的IP
IP_ADDR_STRINGIpAddressList;//绑定到此网卡的IP地址链表
IP_ADDR_STRINGGatewayList;//网关地址链表
IP_ADDR_STRINGDhcpServer;//DHCP服务器地址
BOOLHaveWins;//是否启用了WINS
IP_ADDR_STRINGPrimaryWinsServer;//主WINS地址
IP_ADDR_STRINGSecondaryWinsServer;//辅WINS地址
time_tLeaseObtained;//当前DHCP租借获取的时间
time_tLeaseExpires;//失效时间
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
需要包含头文件Iphlpapi.h,需要包含库文件Iphlpapi.lib
//获取网卡的相关信息,还可以枚举网卡
IP_ADAPTER_INFO*pAdapterInfo;
pAdapterInfo= (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO) );
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
//第一次调用GetAdaptersInfo获取适当的ulOutBufLen变量大小
DWORDres=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);
free(pAdapterInfo);
pAdapterInfo= (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
res=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);
三、获取计算机的DNS设置
采用函数GetNetWorkParams函数可以获得本地计算机的网络参数,从而获得计算机的DNS设置。
DWORD GetNetworkParams(PFIXED_INFO pFixedInfo,PULONG pOutBufLen);
MSDN:This function retrieves network parameters for the local computer.
参数pFixedInfo定义为:
typedef struct {
charHostName[MAX_HOSTNAME_LEN + 4];//主机名字
charDomainName[MAX_DOMAIN_NAME_LEN + 4]; //域名
PIP_ADDR_STRINGCurrentDnsServer; //IP地址的一个节点
IP_ADDR_STRINGDnsServerList; //服务器IP地址链表
UINTNodeType; //节点类型
charScopeId[MAX_SCOPE_ID_LEN + 4]; //
UINTEnableRouting; //
UINTEnableProxy; //
UINTEnableDns; //
} FIXED_INFO, *PFIXED_INFO;
//获取DNS设置
FIXED_INFO*pFixedInfo;
ULONGulOutBufLen;
DWORDdwRetVal;
pFixedInfo= (FIXED_INFO*)malloc(sizeof(FIXED_INFO) );
ulOutBufLen=sizeof(FIXED_INFO);
if(GetNetworkParams(pFixedInfo, &ulOutBufLen) ==ERROR_BUFFER_OVERFLOW)
{
free(pFixedInfo);
pFixedInfo= (FIXED_INFO*)malloc(ulOutBufLen);
}
dwRetVal=GetNetworkParams(pFixedInfo, &ulOutBufLen);
四、获取计算机安装的协议
可以通过函数WSAEnumProtocols获取安装在本地主机上可用的网络协议集。
int WSAEnumProtocols(LPINTlpiProtocols,LPWSAPROTOCOL_INFOlpProtocolBuffer,ILPDWORDlpdwBufferLength);
MSDN:This function retrieves information about available transport protocols.
lpProtocolBuffer是结构WSAPROTOCOL填充的缓冲区,定义为:
typedef struct _WSAPROTOCOL_INFO {
DWORDdwServiceFlags1;
DWORDdwServiceFlags2;
DWORDdwServiceFlags3;
DWORDdwServiceFlags4;
DWORDdwProviderFlags;
GUIDProviderId;
DWORDdwCatalogEntryId;
WSAPROTOCOLCHAINProtocolChain;
intiVersion;
intiAddressFamily;
intiMaxSockAddr;
intiMinSockAddr;
intiSocketType;
intiProtocol;
intiProtocolMaxOffset;
intiNetworkByteOrder;
intiSecurityScheme;
DWORDdwMessageSize;
DWORDdwProviderReserved;
TCHARszProtocol[WSAPROTOCOL_LEN+1];
} WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;
同时也可以调用函数getprotobyname获取对应于给定协议名的相关协议信息:
struct PROTOENT* FAR getprotobyname(const char*name);
MSDN:Thegetprotobynamefunction retrieves the protocol information corresponding to a protocolname.
typedef struct protoent {
char FAR*p_name;//正规协议名
char FARFAR**p_aliases;//一个以空指针结尾的可选协议队列
shortp_proto;//主机字节顺序的协议号
} protoent;
还有一个函数根据协议号来获取协议的相关信息:
struct PROTOENT* FAR getprotobynumber( intnumber);
五、获取计算机提供的服务
可以调用函数getservbyname来获取对应给定服务名和服务协议的相关服务信息。
struct servent* FAR getservbyname( onst char*name,const char*proto);
MSDN:Thegetservbynamefunction retrieves service information corresponding to a service name and protocol.
typedef struct servent {
char FAR*s_name;//正规服务名
char FARFAR**s_aliases; //一个以空指针结尾的可选协议队列
shorts_port;//端口号
char FAR*s_proto;//连接该服务时所用到的协议名
} servent;
也可以调用函数getservbyport来获取对于给定端口号和协议名的相关服务信息:
struct servent* FAR getservbyport( intport, const char*proto);
六、获取计算机的所有网络资源
函数WNetOpenEnum开始一个网络资源或存在的网络连接枚举值,可以通过调用函数WNetEnumResource获取详细的网络资源。
DWORD WNetOpenEnum(
DWORDdwScope,
DWORDdwType,
DWORDdwUsage,
LPNETRESOURCElpNetResource,
LPHANDLElphEnum
);
//上述具体各个参数见MSDN,NETRESOURCE结构体定义如下:
typedef struct _NETRESOURCE {
DWORDdwScope;
DWORDdwType;
DWORDdwDisplayType;
DWORDdwUsage;
LPTSTRlpLocalName;
LPTSTRlpRemoteName;
LPTSTRlpComment;
LPTSTRlpProvider;
} NETRESOURCE;
WNetEnumResource:This function continues a network-resource enumeration started by theWNetOpenEnumfunction.
DWORD WNetEnumResource(
HANDLEhEnum, //这个参数为WNetOpenEnum的最后一个参数
LPDWORDlpcCount,
LPVOIDlpBuffer,
LPDWORDlpBufferSize
);
七、修改本地网络设置
修改本地已经存在的地址解析协议表:SetIpNetEntry:
DWORD SetIpNetEntry( PMIB_IPNETROWpArpEntry);
l设置某一网络接口卡的管理状态,SetIfentry:
DWORD SetIfEntry( PMIB_IFROWpIfRow);
l为本地计算机特定的适配器添加地址,AddIpAddress:
DWORD AddIPAddress(
IPAddrAddress,
IPMaskIpMask,
DWORDIfIndex,
PULONGNTEContext,
PULONGNTEInstance
);
l删除IP地址,DeleteIpAddress:
DWORD DeleteIPAddress( ULONGNTEContext);
八、获取计算机TCP/IP的所有信息
通过函数GetTcpStatics获取本地的TCP协议统计信息:
DWORD GetTcpStatistics( PMIB_TCPSTATSpStats);参数pStats是指向MIB_TCPSTATS的指针,定义如下:
typedef struct _MIB_TCPSTATS {
DWORDdwRtoAlgorithm;
DWORDdwRtoMin;
DWORDdwRtoMax;
DWORDdwMaxConn;
DWORDdwActiveOpens;
DWORDdwPassiveOpens;
DWORDdwAttemptFails;
DWORDdwEstabResets;
DWORDdwCurrEstab;
DWORDdwInSegs;
DWORDdwOutSegs;
DWORDdwRetransSegs;
DWORDdwInErrs;
DWORDdwOutRsts;
DWORDdwNumConns;
} MIB_TCPSTATS, *PMIB_TCPSTATS;
函数GetTcpTable获取TCP协议连接表:
DWORD GetTcpTable(PMIB_TCPTABLEpTcpTable, PDWORDpdwSize, BOOLbOrder);
函数GetIpAddrTable获取网络接口卡与IP地址的映射表:
DWORD GetIpAddrTable( PMIB_IPADDRTABLEpIpAddrTable,PULONGpdwSize,BOOLbOrder);
GetIpStatics获取当前IP统计信息:
DWORD GetIpStatistics( PMIB_IPSTATSpStats);
typedef struct _MIB_IPSTATS {
DWORD dwForwarding;
DWORD dwDefaultTTL;
DWORDdwInReceives;
DWORDdwInHdrErrors;
DWORDdwInAddrErrors;
DWORDdwForwDatagrams;
DWORDdwInUnknownProtos;
DWORDdwInDiscards;
DWORDdwInDelivers;
DWORDdwOutRequests;
DWORDdwRoutingDiscards;
DWORDdwOutDiscards;
DWORDdwOutNoRoutes;
DWORDdwReasmTimeout;
DWORDdwReasmReqds;
DWORDdwReasmOks;
DWORDdwReasmFails;
DWORDdwFragOks;
DWORDdwFragFails;
DWORDdwFragCreates;
DWORD dwNumIf;
DWORD dwNumAddr;
DWORD dwNumRoutes;
} MIB_IPSTATS, *PMIB_IPSTATS;