我用gethostname得到的机器名是1,但用gethostbyname解析该"1"得到正确的IP,请高手们帮助分析一下为何。
查了一下msdn有如下注释:
 If no local host name has been configured, gethostname must succeed and return a token host name that gethostbyname or WSAAsyncGetHostByName can resolve.
不知是否本地主机名未配置,但我明明有主机名的呀,要怎么配置呢?
请高手相助,在线等待!!!
解决马上给分!!

解决方案 »

  1.   

    如果你配置了localhost,则获得的hostname为local host IP为127.0.0.1
    但是你使用getipaddress来获得,如下:
    // TODO: 获得本机的IP地址。子网掩码。广播地址
    STDMETHODIMP CSysInfo::GetIPsAddress(BSTR *pIPAddress,BSTR *pSubnetVal,BSTR *pBroadcastAddr,int* pIPsCounter)
    {    
        wchar_t strIPAddress[1000];
        ::ZeroMemory(&strIPAddress,sizeof(strIPAddress));
        wchar_t strSubnetMask[1000];
        ::ZeroMemory(&strSubnetMask,sizeof(strSubnetMask));
        wchar_t strBroadcastAddr[1000];
        ::ZeroMemory(&strBroadcastAddr,sizeof(strBroadcastAddr));    char cBuffer[10000];
        ::ZeroMemory(&cBuffer,sizeof(cBuffer));
        PMIB_IPADDRTABLE pTable = (PMIB_IPADDRTABLE)cBuffer;
        DWORD dwSize = sizeof(cBuffer);
        if(GetIpAddrTable(pTable,&dwSize,FALSE) == NO_ERROR)
        {
            wchar_t strIPItem[100];        
            *pIPsCounter = pTable->dwNumEntries;
            for(int i=0;i< *pIPsCounter;i++)
            {            
                DWORD addr = pTable->table[i].dwAddr;
                DWORD subnet = pTable->table[i].dwMask;
                DWORD broadcast = pTable->table[i].dwBCastAddr;
                // Filter 127.0.0.1
                if (addr != 0x0100007f)
                {
                    ::ZeroMemory(&strIPItem,sizeof(strIPItem));
                    swprintf(strIPItem,L"%d.%d.%d.%d",(addr & 0xFF),((addr >> 8) & 0xFF),((addr >> 16) & 0xFF),((addr >> 24) & 0xFF));
                    wcscat(strIPAddress,strIPItem);
                    ::ZeroMemory(&strIPItem,sizeof(strIPItem));
                    swprintf(strIPItem,L"%d.%d.%d.%d",(subnet & 0xFF),((subnet >> 8) & 0xFF),((subnet >> 16) & 0xFF),((subnet >> 24) & 0xFF));
                    wcscat(strSubnetMask,strIPItem);
                    ::ZeroMemory(&strIPItem,sizeof(strIPItem));
                    swprintf(strIPItem,L"%d.%d.%d.%d",(broadcast & 0xFF),((broadcast >> 8) & 0xFF),((broadcast >> 16) & 0xFF),((broadcast >> 24) & 0xFF));
                    wcscat(strBroadcastAddr,strIPItem);
                }
            }
        }
        *pIPAddress = SysAllocString(strIPAddress);
        *pSubnetVal = SysAllocString(strSubnetMask);
        *pBroadcastAddr = SysAllocString(strBroadcastAddr);
        return S_OK;
    }
      

  2.   

    to wuxuan(真心英雄):首先谢谢您的回答,但是我的主要目的是获得正确的本机主机名,不知道有没有好的方法呀?
      

  3.   

    To Bind(天高云淡):也谢谢你的回答,可是我的机器名是"edls2",全是英文的,不知道是怎么回事呢,我另外的机器上试是可以的,所以我觉得是不是机器的配置有问题,可是如果是,要怎样配置呢?
      

  4.   

    我用得没任何问题啊!
    WSADATA wsd;
    if(WSAStartup(0X0202, &wsd) != 0){
    return ;
    }
             
             char szName[64];
             gethostname(szName, 64);
      

  5.   

    如果你用 win98 设置了 网络里的 DNS 主机名 , 你取到的就是这个名字
    win2000不存在这种情况, 正常。