//假设sAddress为机器名称,该变量类型为 CString CString sResolved;
unsigned long ulIP;
hostent* pHostent;
sockaddr_in sin; ulIP = inet_addr(sAddress); if(ulIP != INADDR_NONE)
{
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = ulIP;
pHostent = gethostbyaddr((char*)&sin.sin_addr, 4, PF_INET);
if(pHostent)
sResolved = pHostent->h_name;
else
{
TRACE("Error");
return 0;
}
}
else
{
in_addr inetAddr; pHostent = gethostbyname(sAddress);
if(pHostent)
{
LPSTR szAddr;
ulIP = *(DWORD*)(*pHostent->h_addr_list);
inetAddr.s_addr = ulIP;
szAddr = inet_ntoa(inetAddr);
sResolved = szAddr;
}
else
{
TRACE("Error");
return 0;
}
}
unsigned long ulIP;
hostent* pHostent;
sockaddr_in sin; ulIP = inet_addr(sAddress); if(ulIP != INADDR_NONE)
{
sin.sin_family = AF_INET;
sin.sin_addr.S_un.S_addr = ulIP;
pHostent = gethostbyaddr((char*)&sin.sin_addr, 4, PF_INET);
if(pHostent)
sResolved = pHostent->h_name;
else
{
TRACE("Error");
return 0;
}
}
else
{
in_addr inetAddr; pHostent = gethostbyname(sAddress);
if(pHostent)
{
LPSTR szAddr;
ulIP = *(DWORD*)(*pHostent->h_addr_list);
inetAddr.s_addr = ulIP;
szAddr = inet_ntoa(inetAddr);
sResolved = szAddr;
}
else
{
TRACE("Error");
return 0;
}
}
解决方案 »
- VC中查找任务栏图标
- VC6.0读取配置文件
- 用 waveIn , waveOut 如何調節音量大小?如何獲得當前音量大小?
- 我向导生成单文档,就在第六步选基类是CRichEditView,然后运行,居然出现运
- 关于图象处理中的快速傅立叶变换(FFT)
- 从上午到现在怎么没有人回答呀,也不是很难吧。
- PCI配置空间信息,帮忙测试一个小软件
- 怎么使用没有注册的控件....我是菜岛
- 谁帮我逐行分析呀,送100分,很重要,老师布置的任务呀。
- 关于Browser/Sever架构下客户端问题
- 请问在VC做对话框时怎样设置控件(如static控件)里的字体、文字大小、颜色等属性呢,是不是要写代码呀?
- 请教为什么CRecordSet的对象中用GetRecordCount()方法得到的值为空(明明CRecordSet对象中是有值的)
Public Const IP_SUCCESS As Long = 0
Public Const IP_BUF_TOO_SMALL As Long = (11000 + 1)
Public Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2)
Public Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3)
Public Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4)
Public Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5)
Public Const IP_NO_RESOURCES As Long = (11000 + 6)
Public Const IP_BAD_OPTION As Long = (11000 + 7)
Public Const IP_HW_ERROR As Long = (11000 + 8)
Public Const IP_PACKET_TOO_BIG As Long = (11000 + 9)
Public Const IP_REQ_TIMED_OUT As Long = (11000 + 10)
Public Const IP_BAD_REQ As Long = (11000 + 11)
Public Const IP_BAD_ROUTE As Long = (11000 + 12)
Public Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13)
Public Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14)
Public Const IP_PARAM_PROBLEM As Long = (11000 + 15)
Public Const IP_SOURCE_QUENCH As Long = (11000 + 16)
Public Const IP_OPTION_TOO_BIG As Long = (11000 + 17)
Public Const IP_BAD_DESTINATION As Long = (11000 + 18)
Public Const IP_ADDR_DELETED As Long = (11000 + 19)
Public Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20)
Public Const IP_MTU_CHANGE As Long = (11000 + 21)
Public Const IP_UNLOAD As Long = (11000 + 22)
Public Const IP_ADDR_ADDED As Long = (11000 + 23)
Public Const IP_GENERAL_FAILURE As Long = (11000 + 50)
Public Const MAX_IP_STATUS As Long = (11000 + 50)
Public Const IP_PENDING As Long = (11000 + 255)
Public Const PING_TIMEOUT As Long = 500
Public Const WS_VERSION_REQD As Long = &H101
Public Const MIN_SOCKETS_REQD As Long = 1
Public Const SOCKET_ERROR As Long = -1
Public Const INADDR_NONE As Long = &HFFFFFFFF
Public Const MAX_WSADescrIPtion As Long = 256
Public Const MAX_WSASYSStatus As Long = 128Public Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescrIPtion(0 To MAX_WSADescrIPtion) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Long
wMaxUDPDG As Long
dwVendorInfo As Long
End TypePublic Type ICMP_OPTIONS
Ttl As Byte
Tos As Byte
Flags As Byte
OptionsSize As Byte
OptionsData As Long
End TypePublic Type ICMP_ECHO_REPLY
Address As Long
status As Long
RoundTrIPTime As Long
DataSize As Long
'Reserved As Integer
DataPointer As Long
Options As ICMP_OPTIONS
Data As String * 250
End TypePublic Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
End TypePublic Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname As String) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (xDest As Any, xSource As Any, ByVal nbytes As Long)
Public Declare Function lstrlenA Lib "kernel32" (lpString As Any) As Long
Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As LongPublic Function SocketsInitialize() As Boolean Dim WSAD As WSADATA
SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS
End FunctionPublic Function GetIPFromHostName(ByVal sHostName As String) As String
'converts a host name to an IP address.
Dim nbytes As Long
Dim ptrHosent As Long 'address of hostent structure
Dim ptrName As Long 'address of name pointer
Dim ptrAddress As Long 'address of address pointer
Dim ptrIPAddress As Long
Dim lngAddress As Long
ptrHosent = gethostbyname(sHostName & vbNullChar)
If ptrHosent <> 0 Then
'assign pointer addresses and offset
'ptrName is the official name of the host (PC).
'If using the DNS or similar resolution system,
'it is the Fully Qualified Domain Name (FQDN)
'that caused the server to return a reply.
'If using a local hosts file, it is the first
'entry after the IP address.
ptrName = ptrHosent
'Null-terminated list of addresses for the host.
'The Address is offset 12 bytes from the start of
'the HOSENT structure. Note: Here we are retrieving
'only the first address returned. To return more than
'one, define sAddress as a string array and loop through
'the 4-byte ptrIPAddress members returned. The last
'item is a terminating null. All addresses are returned
'in network byte order.
ptrAddress = ptrHosent + 12
'get the IP address
CopyMemory ptrName, ByVal ptrName, 4
CopyMemory ptrAddress, ByVal ptrAddress, 4
CopyMemory ptrIPAddress, ByVal ptrAddress, 4
CopyMemory lngAddress, ByVal ptrIPAddress, 4
GetIPFromHostName = IPToText(lngAddress)
blnGetIPOK = True
Else
blnGetIPOK = False
End If
End FunctionPrivate Function intLoWord(ByVal dw As Long) As Integer
CopyMemory intLoWord, dw, 2
End Function
Private Function intHiWord(ByVal dw As Long) As Integer
CopyMemory intHiWord, ByVal VarPtr(dw) + 2, 2
End Function
Private Function bytLoWord(ByVal dw As Integer) As Byte
CopyMemory bytLoWord, dw, 1
End Function
Private Function bytHiWord(ByVal dw As Integer) As Byte
CopyMemory bytHiWord, ByVal VarPtr(dw) + 1, 1
End FunctionPrivate Function IPToText(ByVal IPAddress As Long) As String IPToText = CStr(bytLoWord(intLoWord(IPAddress))) & "." & _
CStr(bytHiWord(intLoWord(IPAddress))) & "." & _
CStr(bytLoWord(intHiWord(IPAddress))) & "." & _
CStr(bytHiWord(intHiWord(IPAddress)))
End Function首先调用SocketsInitialize()进行初始化,
然后使用GetIPFromHostName取得指定机器IP,参数为空则取本机
#include "stdafx.h"
#include<winsock2.h>#define PROG_NAME "DNS Lookup"
#define HOST_NAME "Yanw" //想查地址的主机
//#define WINSOCK_VERSION 0x0101
#define PF_INET_LENGTH 4#define HOST_ADDR "146.152.195.29"//想查名字的主机int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
WSADATA wsaData;
LPHOSTENT IpHostEnt;
DWORD dwIPAddr;
LPSTR szIPAddr; if(WSAStartup(WINSOCK_VERSION,&wsaData))
MessageBox(NULL,"Could not load Windows sockets DLL ",PROG_NAME,MB_OK|MB_ICONSTOP);
else
{
IpHostEnt=gethostbyname(HOST_NAME);
if(!IpHostEnt)
MessageBox(NULL,"Could not get IP address",HOST_NAME,MB_OK|MB_ICONSTOP);
else
{
szIPAddr=inet_ntoa(*(LPIN_ADDR)*(IpHostEnt->h_addr_list));
MessageBox(NULL,szIPAddr,IpHostEnt->h_name,MB_OK|MB_ICONINFORMATION);
dwIPAddr=inet_addr(HOST_ADDR);
if(dwIPAddr==INADDR_NONE)
MessageBox(NULL,"Invailed internet address",HOST_ADDR,MB_OK|MB_ICONSTOP);
else
{
IpHostEnt=gethostbyaddr((LPSTR)&dwIPAddr,PF_INET_LENGTH,PF_INET);
if(!IpHostEnt)
MessageBox(NULL,"Could not get host name",HOST_ADDR,MB_OK|MB_ICONINFORMATION);
else
MessageBox(NULL,IpHostEnt->h_name,HOST_ADDR,MB_OK|MB_ICONINFORMATION);
}
}
}
WSACleanup();
return (NULL);
}
我这里也有一段源程序的:
看看吧,获得IP和主机名的
BOOL CMyApp::GetLocalNetWorkInfo()
{
HKEY hKey;
DWORD dwDataType;
DWORD dwLength;
LONG lRet; // 读取注册表中的网络信息
lRet = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, (LPCTSTR)gcszNetWorkRegKey, 0, KEY_READ, &hKey );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
} // 得到"工作组"名
dwLength = 50;
lRet = ::RegQueryValueEx( hKey, gcszWorkGroup, NULL, &dwDataType, (LPBYTE)m_szWorkGroup, &dwLength );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
} // 得到"计算机"名
dwLength = 50;
lRet = ::RegQueryValueEx( hKey, gcszComputerName, NULL, &dwDataType, (LPBYTE)m_szComputerName, &dwLength );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
} lRet = ::RegCloseKey( hKey );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
} // 递归搜索"网络邻居"的层次树, 并填充到 m_InfoNetHood
if( !EnumerateNetHood( (LPNETRESOURCE)NULL ) )
return FALSE;
m_timePrev = CTime::GetCurrentTime(); return TRUE;
}
BOOL CMyApp::EnumerateNetHood( LPNETRESOURCE lpnr )
{
DWORD dwRet, dwRetEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384;
DWORD cEntries = 0xFFFFFFFF;
LPNETRESOURCE lpnrLocal;
DWORD i; CString str;
int nLevel = -1;
CString strDisplayName;
CString strTrueName;
dwRet = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum );
if( dwRet == WN_FUNCTION_BUSY ¦¦ dwRet == ERROR_BAD_NET_NAME )
return TRUE; if( dwRet != NO_ERROR ) {
NetErrorMessageBox( dwRet, "WNetOpenEnum" );
return FALSE;
}
do {
lpnrLocal = (LPNETRESOURCE)GlobalAlloc( GPTR, cbBuffer );
dwRetEnum = WNetEnumResource( hEnum, &cEntries, lpnrLocal, &cbBuffer);
if( dwRetEnum == NO_ERROR) {
for( i = 0; i < cEntries; i++ ) {
// 只搜索网络提供者为"Microsoft Network"的资源
str="Microsoft Network";
int nCmpNo = lstrcmpi( (LPCTSTR)lpnrLocal[i].lpProvider, (LPCTSTR)str );
if( nCmpNo )
continue; // 只包括 Container 资源, 共享磁盘、打印机不具有 RESOURCEUSAGE_CONTAINER 属性
if( RESOURCEUSAGE_CONTAINER ==
( lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER ) ) {
nLevel = -1;
switch( lpnrLocal[i].dwDisplayType ) {
case RESOURCEDISPLAYTYPE_NETWORK: // 整个网络
nLevel = 0;
strDisplayName.LoadString( IDS_ENTIRNET );
strTrueName = "*";
break;
case RESOURCEDISPLAYTYPE_DOMAIN: // 工作组
nLevel = 1;
strTrueName.LoadString( IDS_WORKGROUP );
strDisplayName.Format( "%s%s", lpnrLocal[i].lpRemoteName, strTrueName );
strTrueName = lpnrLocal[i].lpRemoteName;
break;
case RESOURCEDISPLAYTYPE_SERVER: // 计算机
nLevel = 2;
// 加 2 是为去掉前缀"//"
strDisplayName.Format( "%s", lpnrLocal[i].lpRemoteName + 2 );
strTrueName = strDisplayName;
break;
}
ASSERT( nLevel != -1 );
NewInfoNetHood( nLevel, strTrueName, strDisplayName ); if( !EnumerateNetHood( &lpnrLocal[i] ) )
return FALSE;
}
}
}
else
if( dwRetEnum != ERROR_NO_MORE_ITEMS ) {
NetErrorMessageBox( dwRetEnum, "WNetEnumResource" );
return FALSE;
}
}
while( dwRetEnum != ERROR_NO_MORE_ITEMS );
GlobalFree( (HGLOBAL)lpnrLocal );
dwRet = WNetCloseEnum( hEnum );
if( dwRet != NO_ERROR ) {
NetErrorMessageBox( dwRet, "WNetCloseEnum" );
return FALSE;
}
return TRUE;
}