//假设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;
    }
  }

解决方案 »

  1.   

    Public Const IP_STATUS_BASE As Long = 11000
    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,参数为空则取本机
      

  2.   

    我有一段小程序:
    #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);
    }
      

  3.   

    到底行不行啊,怎么没有了回信:
    我这里也有一段源程序的:
    看看吧,获得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 &brvbar; 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 &brvbar; 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 &brvbar; MB_ICONSTOP );
        return FALSE;
      }  lRet = ::RegCloseKey( hKey );
      if( lRet != ERROR_SUCCESS ) {
        AfxMessageBox( IDS_INIT_ERROR_1, MB_OK &brvbar; 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 &brvbar;&brvbar; 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;