在同网段内  检测是否IP占用可以用 sendary 来操作,这个我已经实现但是如果我的IP是 192.168.1.*  就没办法检测192.168.0.*网段某个IP是否被占用ping可能被禁用,不能达到百分百检测目的本机是可以捕获windows弹出的对话框,提示你所设置的静态IP网络已有,这个对话框弹出是代表的是你已经设置成功该IP,并造成了冲突。使本机无法连接网络,以后无法sendarp了,重新设置的IP无法再检测是否冲突了。有什么方法可以解决?

解决方案 »

  1.   

    遍历局域网内所有IP然后,看有没有和要设置的重复的
    struct   hostent   *host;   
    struct   in_addr   *ptr; //   To   retrieve   the   IP   Address   
        
    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   (unsigned   int   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   ));   
    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();
      

  2.   

    http://topic.csdn.net/u/20090818/13/e220177c-4a85-4329-b25a-82cad56214cd.html?20901
    希望有用
      

  3.   

    1#貌似不太对,浅见,不要当真由于IP冲突,你已经无法连上局域网,自然更不可能去局域网中遍历所有的机器IP冲突只能预防,这里有个源代码可以参考  
      

  4.   

    自己基于ICMP协议些个ping程序好了,把对IP包自己进行封装,自己接收IP的代码,也许这样可以实现,或者建个软路由也许也能实现.
      

  5.   

    ARP包不能跨路由器,或者讲跨网段,要想跨网段,只能在网关处做一个代理程序,转发ARP包和ARP应答包。
      

  6.   


    ICMP很多机子为了防止ping攻击,被禁用了,所以此路不通
      

  7.   


    实际上就是我在更改我IP前,要检测下是否此IP已经被占用了,同网段内255个ip
    可以用sendarp确认但是跨网段无法检测,如果强制更改,如果此IP已经被别的机子用了,windows会
    弹出个对话框告诉你,这个静态IP已经被占用,但是你拿到这个对话框时,你的IP
    已经设置好了,已经在冲突了。现在由什么办法可以异网段检测下此IP是否被在占用。
      

  8.   

    即然不在同一个网段,当然不存在此IP被占用的情况,网段不同,IP地址肯定不同。IP冲突,只存在同个一个网段中。