各位高手,我是一个初学菜鸟。我编了一个局域网聊天软件,但是在同一局域网不同交换机通讯却会出错,出错是下面两句代码:
  pHost=gethostbyname(strHostName);//获得对方的主机名
  addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]); //通过对方的主机名获取对方的IP地址
执行后发现,无法获得对方的IP,但却可以取得对方的主机名。请问我该怎么做?

解决方案 »

  1.   

    ping 得通的,我们同宿舍可以互聊.但是在不同宿舍就对聊不到了,但我们是同一局域网,不同交换机..一互聊就会出错.
    从调试中我看到,无法从主机名获得IP..
      

  2.   

    这个好像不关事吧!因为我是用winsock编的,在同一宿舍也有杀毒软件跟防火墙,但也可以照样通讯
      

  3.   

    根据lz的描述 我认为:你和你同学在不同宿舍 不能通信 是以为 在不同的子网(但是可能在同一个局域网)
    子网内的主机 对外是不可见的  因为网关会进行NAT  如果你想 通信 就要进行打洞
      

  4.   

    xuer_07  主机名我获取得到,但是根据对方的主机名获取IP就不行了
      

  5.   

    duoniduoni  你指的打洞具体要怎么做?能就详细点吗?
      

  6.   

    //////////////////
    // 获得主机名.
    //
    char hostname[256];
    int res = gethostname(hostname, sizeof(hostname));
    if (res != 0) {
    printf("Error: %un", WSAGetLastError());
    return -1;
    }
    printf("hostname=%sn", hostname);
    ////////////////
    // 根据主机名获取主机信息. 
    //
    hostent* pHostent = gethostbyname(hostname);
    if (pHostent==NULL) {
    printf("Error: %un", WSAGetLastError());
    return -1;
    }
    //////////////////
    // 解析返回的hostent信息.
    //
    hostent& he = *pHostent;
    printf("name=%snaliases=%snaddrtype=%dnlength=%dn",
    he.h_name, he.h_aliases, he.h_addrtype, he.h_length);sockaddr_in sa;
    for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
    memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
    // 输出机器的IP地址.
    printf("Address: %sn", inet_ntoa(sa.sin_addr)); // 显示地址串
    }
      

  7.   

    8楼,LZ说那两台机器之间能PING得通,应该不需要打洞吧。俺可能是LZ什么地方用错了。
      

  8.   

    大家不好意思,这两天我忙着考试..
    11楼    sockaddr_in sa;
    for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
    memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
    // 输出机器的IP地址.
    printf("Address: %sn", inet_ntoa(sa.sin_addr)); // 显示地址串
    }
    就是这一步好像取不到对方的IP地址.
      

  9.   

    在\WINDOWS\system32\drivers\etc\hosts文件中加上对房的IP与组机名
    127.0.0.1       hostname