找回密码
 加入
搜索
查看: 65067|回复: 10

[网络通信] 如何将IP冲突,作为判断条件

  [复制链接]
发表于 2013-9-5 19:30:56 | 显示全部楼层 |阅读模式
如何将IP冲突,作为判断条件

例如,当存在与本机IP冲突时,修改本机IP。

请各位朋友帮忙下。
发表于 2013-9-5 22:13:55 | 显示全部楼层
本帖最后由 虫子樱桃 于 2013-9-5 22:18 编辑

官网上搜索的,希望对你有帮助,Windows应该有对应的消息的,但是这个我不是很懂,呵呵,爱莫能助了

#include <Inet.au3>
$octet = 0
call ("octet")

func octet()
while 1=1

$octet = Random(2, 254,1)
$ping = ping("206.23.108." & $octet, 5000)
if $ping = 0 Then
call("change")
EndIf
wend
endfunc
func change()
    Run(@ComSpec & " /c " & 'netsh interface ip set address name="Local Area Connection" static 206.23.108.' & $octet & ' 255.255.255.0 206.23.108.1 1', "", "")
sleep(4000)
$IP = _GetIP()

Select
    case $IP = -1
        call("octet")
    case $IP <> -1
        MsgBox(1, "New Ip Assigned", "206.23.108." & $octet)
        exit
EndSelect
    endfunc


翻到一段c++ 用的sendarp,不是很懂,也希望论坛的大牛帮你改造下,作为参考
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

void usage(char *pname)
{
    printf("Usage: %s [options] ip-address\n", pname);
    printf("\t -h \t\thelp\n");
    printf("\t -l length \tMAC physical address length to set\n");
    printf("\t -s src-ip \tsource IP address\n");
    exit(1);
}

int __cdecl main(int argc, char **argv)
{
    DWORD dwRetVal;
    IPAddr DestIp = 0;
    IPAddr SrcIp = 0;       /* default for src ip */
    ULONG MacAddr[2];       /* for 6-byte hardware addresses */
    ULONG PhysAddrLen = 6;  /* default to length of six bytes */

    char *DestIpString = NULL;
    char *SrcIpString = NULL;

    BYTE *bPhysAddr;
    unsigned int i;

    if (argc > 1) {
        for (i = 1; i < (unsigned int) argc; i++) {
            if ((argv[i][0] == '-') || (argv[i][0] == '/')) {
                switch (tolower(argv[i][1])) {
                case 'l':
                    PhysAddrLen = (ULONG) atol(argv[++i]);
                    break;
                case 's':
                    SrcIpString = argv[++i];
                    SrcIp = inet_addr(SrcIpString);
                    break;
                case 'h':
                default:
                    usage(argv[0]);
                    break;
                }               /* end switch */
            } else
                DestIpString = argv[i];
        }                       /* end for */
    } else
        usage(argv[0]);

    if (DestIpString == NULL || DestIpString[0] == '\0')
        usage(argv[0]);

    DestIp = inet_addr(DestIpString);

    memset(&MacAddr, 0xff, sizeof (MacAddr));

    printf("Sending ARP request for IP address: %s\n", DestIpString);

    dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

    if (dwRetVal == NO_ERROR) {
        bPhysAddr = (BYTE *) & MacAddr;
        if (PhysAddrLen) {
            for (i = 0; i < (int) PhysAddrLen; i++) {
                if (i == (PhysAddrLen - 1))
                    printf("%.2X\n", (int) bPhysAddr[i]);
                else
                    printf("%.2X-", (int) bPhysAddr[i]);
            }
        } else
            printf
                ("Warning: SendArp completed successfully, but returned length=0\n");

    } else {
        printf("Error: SendArp failed with error: %d", dwRetVal);
        switch (dwRetVal) {
        case ERROR_GEN_FAILURE:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_INVALID_PARAMETER:
            printf(" (ERROR_INVALID_PARAMETER)\n");
            break;
        case ERROR_INVALID_USER_BUFFER:
            printf(" (ERROR_INVALID_USER_BUFFER)\n");
            break;
        case ERROR_BAD_NET_NAME:
            printf(" (ERROR_GEN_FAILURE)\n");
            break;
        case ERROR_BUFFER_OVERFLOW:
            printf(" (ERROR_BUFFER_OVERFLOW)\n");
            break;
        case ERROR_NOT_FOUND:
            printf(" (ERROR_NOT_FOUND)\n");
            break;
        default:
            printf("\n");
            break;
        }
    }

    return 0;
}
发表于 2013-9-6 01:12:19 | 显示全部楼层


ACN_NET.au3

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2013-9-6 01:14:17 | 显示全部楼层
发现自己还是缺的太多了,尝试自己调用SendARP,好多地方不知道如何下手。
MSDN上写第三个参数是ULONG,但这里却写成byte[6],真的是理解能力有限。。。
发表于 2013-9-8 11:43:33 | 显示全部楼层
函数原型,第三个参数是一个ulong 的指针

DWORD SendARP(
  _In_     IPAddr DestIP,
  _In_     IPAddr SrcIP,
  _Out_    PULONG pMacAddr,
  _Inout_  PULONG PhyAddrLen
);
发表于 2013-9-9 08:42:55 | 显示全部楼层
没怎么弄懂。
 楼主| 发表于 2013-9-9 10:57:56 | 显示全部楼层
回复 3# nmgwddj

    谢谢朋友指点,遗憾的是,经过测试,这个似乎不能实现我想要的功能。
    测试现象如下,当本机为二号服务器时(已经替代一号服务器,且IP为一号服务器),如果一号服务器修复正常,那么势必造成IP冲突。但是此时,二号服务器的mac仍旧能被正常获取,也就是说无法扑捉到错误信息。注意程序必须要安装在二号服务器上,用来捕捉错误信息,修正自己的ip值。
发表于 2013-9-9 12:05:01 | 显示全部楼层
回复 8# x163169x


    不要忽略了本机的arp缓存表。
发表于 2013-9-10 18:52:44 | 显示全部楼层
学习中,留个爪爪.
发表于 2013-9-14 23:15:01 | 显示全部楼层
学习中。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-5 01:11 , Processed in 0.073120 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表