编写一个软件,目的是当局域网中的用户启动该软件时,
能在软件的界面上显示启动该软件的用户ip,类似飞鸽一样。
请问如何实现??

解决方案 »

  1.   

    如果要获得本地所有IP,用gethostname获取本机名称,再用gethostbyname获取本机地址。
    如果要获取一个连接使用的本机地址,用getsockname;获取对方地址用getpeername 。
      

  2.   

    如果是得到局域网工作组中电脑的IP则会有很多的方法
      但是如果要查找非网络邻居的ip方法就比较少了1.用ping,当然可以,但是如果要在程序中实现不大合理,而且我觉得速度也快不到哪里去  
    2.用winpcap发送arp请求包可以获得,但是获取时间不确定,而且获取速度不算太快  
    3.用SendARP函数,对于需要扫描255个主机时简直太慢了不能忍受,感觉程序都无法响应了。于是我尝试着?55个线程分别调用SendARP函数,结果发现大多数SendArp都调用失败,错误值是31。不知道为什么  
    4.看到网上有人使用先枚举网络资源,再获取主机信息,然后有主机名获取IP,最后由IP获取MAC的方法,我觉得速度也快不到哪里去(这个没有具体试过) 
    有个链接
    http://blog.chinaunix.net/u2/64540/showart_654371.html
      

  3.   

    2.用winpcap发送arp请求包可以获得,但是获取时间不确定,而且获取速度不算太快  
    ------------------还行吧,我测试过,1~254,全部获取也就花个7、8秒左右,而且我也只开了2个线程,一个发送(发送间隔20ms),一个接收,线程再多开几个估计还会快点
      

  4.   

    开发;卓越呼叫中心、三农热线”语音农业综合信息服务平台、卓越办公自动化软件、卓越电厂MIS系统、卓越客户关系管理系统、卓越网站制作、卓越医疗信息管理系统;沈阳卓越科技有限公司;www.excellence-tech.com
      

  5.   

    开发;卓越呼叫中心、三农热线”语音农业综合信息服务平台、卓越办公自动化软件、卓越电厂MIS系统、卓越客户关系管理系统、卓越网站制作、卓越医疗信息管理系统;沈阳卓越科技有限公司;http://www.excellence-tech.com
      

  6.   

    DWORD dwScope = RESOURCE_CONTEXT;
     NETRESOURCE *NetResource = NULL;
     HANDLE hEnum; WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum); WSADATA wsaData; WSAStartup(MAKEWORD(1,1),&wsaData);  if (hEnum)
     {
      DWORD Count = 0xFFFFFFFF;
      DWORD BufferSize = 2048;
      LPVOID Buffer = new char[2048];  WNetEnumResource(hEnum, &Count, Buffer, &BufferSize);
      NetResource = (NETRESOURCE*)Buffer;
      char szHostName[200];  for (UINT i = 0; i < BufferSize/sizeof(NETRESOURCE); i++, NetResource++)
      {
       if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY)
       {
        if (NetResource->lpRemoteName)
        {
         CString strFullName = NetResource->lpRemoteName;     
         char buf[512];
         if (0 == strFullName.Left(2).Compare("\\\\"))
         strFullName = strFullName.Right(strFullName.GetLength()-2);     gethostname(szHostName, strlen( szHostName )); //LOCAL COMPUTER NAME     host = gethostbyname(strFullName);     if (!host) continue;     ptr = (struct in_addr *) host->h_addr_list[0];     sprintf(buf, "%d.%d.%d.%d", ptr->S_un.S_un_b.s_b1, 
          ptr->S_un.S_un_b.s_b2, ptr->S_un.S_un_b.s_b3, ptr->S_un.S_un_b.s_b4);   }
       }
      }
      delete Buffer;
      WNetCloseEnum(hEnum);
     }
     WSACleanup();
      

  7.   

    char szLocal[255];
    gethostname(szLocal,255);
    hostent* phost=gethostbyname(szLocal);
    for (int i=0;;i++)
    {
    char* paddr=phost->h_addr_list[i];
    if(paddr==NULL)
    break; in_addr inaddr;
    memcpy(&inaddr.s_addr,paddr,phost->h_length);
    char* pip=inet_ntoa(inaddr);
    printf("IPAddress:%s",pip);}
    这段代码比较简单,直观一些
      

  8.   

    楼上的方法只能获得本地的主机IP
    我的目的是获得所有启动该软件的局域网的IP
      

  9.   

    greatws :
    用SendARP函数方法时,获得的是局域网上所有的IP
    而不是启动该软件的局域网的IP
      

  10.   

    你可以这么办:
    1、你那个软件在启动后就启动向局域网内指定端口广播如13000端口,你可以使用周期性广播,广播的内容就是身份标识,你可以自己定。这些可以在一个线程内进行
    2、再开一个线程,专门用于接收局域网内得广播(绑定上面指定的那个端口),通过广播得内容来判断是你这套软件的广播,另外通过接收套接字函数,你可以确定对方得IP ,这样就可以获得局域网中得你的软件运行机器上的IP 。也就是每个软件在启动后都发自己的身份广播,同时接收局域网内别的广播,这样你就可以像 飞鸽那样得到局域网内的运行飞鸽的电脑的IP    总之: 套接字广播收发+多线程