当前位置:  技术问答>linux和unix

求LAN中IP冲突的检测方法

    来源: 互联网  发布时间:2015-08-08

    本文导语:  在LAN中怎样才能知道本机与其它机器的IP地址有冲突了呢? 我想了一个办法是:本机定时发送一个ARP请求包, ... uint32_t localip; u_char zero [] = {0, 0, 0, 0, 0, 0, 0}; u_char localmac[7]; struct ether_arp *arp; ... arp->arp_hdr = ...

在LAN中怎样才能知道本机与其它机器的IP地址有冲突了呢?
我想了一个办法是:本机定时发送一个ARP请求包,
...
uint32_t localip;
u_char zero [] = {0, 0, 0, 0, 0, 0, 0};
u_char localmac[7];
struct ether_arp *arp;
...
arp->arp_hdr = htons (ETHERTYPE_ARP);
arp->arp_pro = htons (ETHERTYPE_IP);
arp->arp_hln = 6;
arp->arp_pln = 4;
arp->arp_op  = htons (ARPOP_REQUEST);
memcpy (arp->arp_sha, localmac, 6);
memcpy (arp->arp_spa, (void *)&localip, 4);
memcpy (arp->arp_tha, zero, 6);
memcpy (arp->arp_tpa, (void *)&localip, 4);
...

我把两个机器的IP设为相同,在此机上运行此程序怎么没有ARP REPLY包呢?

还附一个问题就是:输出MAC地址时,用指针不行但用数组行,如*p++,*p++,*p++,*p++,*p++,*p++,*p++不行,但用p[0],p[1],p[2],p[3],p[4],p[5]行啊,WHY?

|
发ARP包的代码。你改写成unix下用的吧。

#include 
#include 
#include 
#include 

typedef struct tagIPINFO
{
u_char Ttl; // Time To Live
u_char Tos; // Type Of Service
u_char IPFlags; // IP flags
u_char OptSize; // Size of options data
u_char FAR *Options; // Options data buffer
}IPINFO, *PIPINFO;

typedef struct tagICMPECHO
{
u_long Source;
u_long Status;
u_long RTTime;
u_short DataSize;
u_short Reserved;
void FAR *pData;
IPINFO ipInfo;
}ICMPECHO, *PICMPECHO;


//ICMP API
//HANDLE WINAPI IcmpCreateFile (VOID); 
//BOOL WINAPI IcmpCloseHandle (HANDLE IcmpHandle); 
//DWORD WINAPI IcmpSendEcho (HANDLE IcmpHandle,IPAddr DestinationAddress,
// LPVOID RequestData,WORD RequestSize,
// PIP_OPTION_INFORMATION RequestOptions,
// LPVOID ReplyBuffer,DWORD ReplySize, DWORD Timeout); 

// ICMP.DLL Export Function Pointers
HANDLE (WINAPI *pIcmpCreateFile)(VOID);
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
DWORD (WINAPI *pIcmpSendEcho)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);

//
//
void main(int argc, char **argv)
{
WSADATA wsaData; // WSADATA
ICMPECHO icmpEcho; // ICMP Echo reply buffer
HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL
HANDLE hndlFile; // Handle for IcmpCreateFile()
    LPHOSTENT pHost; // Pointer to host entry structure
    struct in_addr iaDest; // Internet address structure
DWORD *dwAddress; // IP Address
IPINFO ipInfo; // IP Options structure
int nRet; // General use return code
DWORD dwRet; // DWORD return code
int x;

// Check arguments
if (argc != 2)
{
fprintf(stderr,"nSyntax: pingi HostNameOrIPAddressn");
return;
}

// Dynamically load the ICMP.DLL
hndlIcmp = LoadLibrary("ICMP.DLL");
if (hndlIcmp == NULL)
{
fprintf(stderr,"nCould not load ICMP.DLLn");
return;
}
// Retrieve ICMP function pointers
pIcmpCreateFile = (HANDLE (WINAPI *)(void))
GetProcAddress(hndlIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
GetProcAddress(hndlIcmp,"IcmpCloseHandle");
pIcmpSendEcho = (DWORD (WINAPI *)
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
GetProcAddress(hndlIcmp,"IcmpSendEcho");
// Check all the function pointers
if (pIcmpCreateFile == NULL || 
pIcmpCloseHandle == NULL ||
pIcmpSendEcho == NULL)
{
fprintf(stderr,"nError getting ICMP proc addressn");
FreeLibrary(hndlIcmp);
return;
}

// Init WinSock
nRet = WSAStartup(0x0101, &wsaData );
    if (nRet)
    {
        fprintf(stderr,"nWSAStartup() error: %dn", nRet); 
        WSACleanup();
FreeLibrary(hndlIcmp);
        return;
    }
    // Check WinSock version
    if (0x0101 != wsaData.wVersion)
    {
        fprintf(stderr,"nWinSock version 1.1 not supportedn");
        WSACleanup();
FreeLibrary(hndlIcmp);
        return;
    }

// Lookup destination
    // Use inet_addr() to determine if we're dealing with a name
    // or an address
    iaDest.s_addr = inet_addr(argv[1]);
    if (iaDest.s_addr == INADDR_NONE)
        pHost = gethostbyname(argv[1]);
    else
        pHost = gethostbyaddr((const char *)&iaDest, 
                        sizeof(struct in_addr), AF_INET);
if (pHost == NULL)
{
fprintf(stderr, "n%s not foundn", argv[1]);
        WSACleanup();
FreeLibrary(hndlIcmp);
return;
}

// Tell the user what we're doing
printf("nPinging %s [%s]", pHost->h_name,
inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0])));

// Copy the IP address
dwAddress = (DWORD *)(*pHost->h_addr_list);

// Get an ICMP echo request handle        
hndlFile = pIcmpCreateFile();
for (x = 0; x = 0 )
     && ( dip - ntohl(sip) 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么判断是从WAN口还是LAN口登陆的路由器
  • lan 中有能缓存服务器吗
  • Linux与window xp 如何实现在LAN 中的共通信息!
  • 红旗Linux桌面版2.0 如何设置网络才可通过 LAN 访问 Internet ?
  • 有关pc mac lan
  • 如何在登陆UNIX系统后,在类似DOS模式下给LAN中的WINDOW系统发送信息
  • 请问在redhat linux7.0 下如何访问lan中win98共享出来的资源!一定给分!!
  • 各位大虾,我的Red Hat Linux 7.2 (办公室高速LAN连接/固定IP)如何才能顺利上网???
  • 救命!!LAN上的其他机器无法访问TELNET/HTTP/FTP等服务!!!
  • 刚装完rhat5.2,能ping通lan网,ping不通外网
  • 各位老大,你们是从哪些方面改进网卡驱动程序的效率,欧现在写了一个lan91c嵌入式网卡的驱动,需要帮助
  • 初学redhat,LAN方式上网都不行,哪里出问题了?
  • 请问如后配置嵌入式网卡LAN91C11X系列的自动协商模式(Auto-Negotiation)?
  • 怎样配置IPTables能让LAN对外的请求全部通过?
  • LAN存取控制 FreeNAC


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3