如何将IP冲突,作为判断条件
如何将IP冲突,作为判断条件例如,当存在与本机IP冲突时,修改本机IP。
请各位朋友帮忙下。 本帖最后由 虫子樱桃 于 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 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; /* 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 == '-') || (argv == '/')) {
switch (tolower(argv)) {
case 'l':
PhysAddrLen = (ULONG) atol(argv[++i]);
break;
case 's':
SrcIpString = argv[++i];
SrcIp = inet_addr(SrcIpString);
break;
case 'h':
default:
usage(argv);
break;
} /* end switch */
} else
DestIpString = argv;
} /* end for */
} else
usage(argv);
if (DestIpString == NULL || DestIpString == '\0')
usage(argv);
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);
else
printf("%.2X-", (int) bPhysAddr);
}
} 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;
}
ACN_NET.au3 发现自己还是缺的太多了,尝试自己调用SendARP,好多地方不知道如何下手。
MSDN上写第三个参数是ULONG,但这里却写成byte,真的是理解能力有限。。。 函数原型,第三个参数是一个ulong 的指针
DWORD SendARP(
_In_ IPAddr DestIP,
_In_ IPAddr SrcIP,
_Out_ PULONG pMacAddr,
_Inout_PULONG PhyAddrLen
); 没怎么弄懂。 回复 3# nmgwddj
谢谢朋友指点,遗憾的是,经过测试,这个似乎不能实现我想要的功能。
测试现象如下,当本机为二号服务器时(已经替代一号服务器,且IP为一号服务器),如果一号服务器修复正常,那么势必造成IP冲突。但是此时,二号服务器的mac仍旧能被正常获取,也就是说无法扑捉到错误信息。注意程序必须要安装在二号服务器上,用来捕捉错误信息,修正自己的ip值。 回复 8# x163169x
不要忽略了本机的arp缓存表。 学习中,留个爪爪. 学习中。。。。。
页:
[1]