CString GetIP()
{        WORD wversion;
        WSADATA wsadata;
        int err;
        wversion=MAKEWORD(1,1);
        err=WSAStartup(wversion,&wsadata);
        if(err=0)
{
    char hostname[256];
    int res=gethostname(hostname,sizeof(hostname));
             struct hostent *pHostEnt;
    pHostEnt=gethostbyname(hostname);
             sockaddr_in addr;
    memcpy(&addr.sin_addr.s_addr,pHostEnt->h_addr_list[0],pHostEnt->h_length);
    return inet_ntoa((addr.sin_addr));
}
     WSACleanup();
 
}
调用上面的函数,运行时发生错误!请问应该怎么写?谢谢!!!

解决方案 »

  1.   

    参考我以前写的,自己比较一下:
    char szHostName[128];//将计算机名称放入数组中
    struct hostent *pHost;//定义一个结构体指针变量pHost
    //通过gethostname函数来获取计算机的名称
    if(!gethostname(szHostName,sizeof(szHostName)))//获取成功
    {
    SetDlgItemText(IDC_NAME,szHostName);
    //通过函数gethostbyname和计算机的名称来获取计算机的IP地址
    pHost = gethostbyname(szHostName);
    //将所获取的IP地址转化为真正的IP地址
    LPCSTR IPAddress = inet_ntoa(*(struct in_addr*)(*pHost->h_addr_list));
    SetDlgItemText(IDC_IP,IPAddress);
    }
    else
    {
    AfxMessageBox("<信息未知>");
    }
      

  2.   

    请问楼上 的朋友  初始化函数和终止Windows Sockets Api的函数WSAStartup(),WSACleanup()怎么调用阿,上面我写的调用语句对不对?谢谢!!
      

  3.   

    wversion=MAKEWORD(1,1);
    err=WSAStartup(wversion,&wsadata);
    调用好像都是对的,你的错误代码是什么,用WSAGetLastError()看下,可能是1.1版本的太低了吧,你把MAKEWORD(1,1);改成MAKEWORD(2,2);看下.
      

  4.   

    这样得到字符串形式的:
    char szHostName[256];
    gethostname(szHostName,256);
        
    //get ipv4 address.
    hostent *pHost=::gethostbyname(szHostName);
    in_addr addr;
    char *p=pHost->h_addr_list[0];
    memcpy(&addr.S_un.S_addr,p,pHost->h_length);
    char *v4IP=::inet_ntoa(addr);
      

  5.   

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested=MAKEWORD(1,1);
    WSAStartup(wVersionRequested,&wsaData);
    hostent *p;
    char s[128];
    char *p2;
    gethostname(s,128);
    p=gethostbyname(s);
    p2=inet_ntoa(*((in_addr*)p->h_addr));//或者为p2=inet_ntoa(*((in_addr*)p->h_addr_list[0]));
    m_LocalIp=CString(p2);
    UpdateData(false);
    你试验一下,我已经调试通过了
      

  6.   

    对了,还必须要加上头文件
    #include "nb30.h"
    #include "Winsock2.h"
      

  7.   


    #include <stdio.h>
    CInitSock initSock; // 初始化Winsock库void main()
    {
    char szHost[256];
    // 取得本地主机名称
    ::gethostname(szHost, 256);
    // 通过主机名得到地址信息
    hostent *pHost = ::gethostbyname(szHost);
    // 打印出所有IP地址
    in_addr addr;
    for(int i = 0; ; i++)
    {
    char *p = pHost->h_addr_list[i];
    if(p == NULL)
    break; memcpy(&addr.S_un.S_addr, p, pHost->h_length);
    char *szIp = ::inet_ntoa(addr);
    printf(" 本机IP地址:%s  \n ", szIp);
    }
    }
      

  8.   

    解决了,谢谢各位朋友的帮忙!!特别是zhiyong1822(zhiyong) ,非常感谢你!!!