⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ping.c

📁 嵌入式RMON,RMON为Remote monitor的缩写,基于SNMP为网络提供主动监控及错误告警,智能交换路由必备协议
💻 C
字号:
/* Beholder RMON ethernet network monitor,Copyright (C) 1993 DNPAP group *//* See file COPYING 'GNU General Public Licence' for copyright details   */#include <chain.h>#include <icmp.h>#include <ip.h>#include <timer.h>#include <dtime.h>#include "ping.h"static VOID TimerCallback(TIMER_DESCR *timer, ULONG now, void *parm);static BOOLEAN IcmpCallback(ICMP_DESCR *icmp, CHAIN *chain,            ICMP_HDR *icmpHdr, IP_HDR *ipHdr);PING_DESCR *PingSend(DWORD addr, ULONG timeout, USHORT length, USHORT seqnr,                PING_CALLBACK callback, VOID *parm){    ICMP_DESCR   *icmp;    TIMER_DESCR *timer;    PING_DESCR  *ping;    CHAIN       *chain;         ICMP_HDR     icmpHdr;    IP_HDR      ipHdr;      ping=DnpapMalloc(sizeof(PING_DESCR));    if (ping==0)    {        return 0;    }    ping->parm=parm;    ping->callback=callback;    ping->seqnr=seqnr;    ping->length=length;    ping->start=0;    ping->timer=0;    ping->icmp=0;    icmp=DnpapMalloc(sizeof(ICMP_DESCR));    if (icmp==0)    {        DnpapFree(ping);        return 0;    }    icmp->Rcve=IcmpCallback;    icmp->type=ICMP_ECHO_REPLY;    icmp->code=ICMP_CODE_ANY;    icmp->id=IcmpAnyId();    icmp->seqnr=ICMP_SEQNR_ANY;    icmp->remAddr=addr; #ifdef OS2    icmp->locAddr=IpRouteFindSrc(addr);#else       icmp->locAddr=ICMP_ADDR_ANY;   #endif    icmp->specific=ping;    if (!IcmpRegister(icmp))    {        DnpapFree(icmp);        DnpapFree(ping);        return 0;    }    ping->icmp=icmp;        timer=TimerRegister(TimerCallback, ping, timeout, TIMER_FOREVER, TIMER_TYPE_SKIP);    if (timer==0)    {        IcmpRemove(icmp);        DnpapFree(icmp);        DnpapFree(ping);        return 0;    }    ping->timer=timer;        chain = ChainAlloc(0,0,length+34,length,34,0);    if (chain==0)    {        TimerRemove(ping->timer);        IcmpRemove(ping->icmp);        DnpapFree(ping->icmp);        DnpapFree(ping);        return 0;    }    ipHdr.src=icmp->locAddr;    ipHdr.dst=icmp->remAddr;    ipHdr.options=0;    ipHdr.iol=0;    icmpHdr.type=ICMP_ECHO_REQUEST;    icmpHdr.code=0;    icmpHdr.id=icmp->id;    icmpHdr.seqnr=seqnr;        ping->start=TimeUsec();        if (!IcmpSend(chain, &icmpHdr, &ipHdr))    {        ChainFree(chain);        TimerRemove(ping->timer);        IcmpRemove(ping->icmp);        DnpapFree(ping->icmp);        DnpapFree(ping);        return 0;    }    ChainFree(chain);    return ping;}VOID PingAbort(PING_DESCR *ping){    if (ping==0)        return;        TimerRemove(ping->timer);    IcmpRemove(ping->icmp);    DnpapFree(ping->icmp);    DnpapFree(ping);}static VOID TimerCallback(TIMER_DESCR *timer, ULONG now, void *parm){    PING_DESCR *ping;            ping = parm;    ping->callback(ping, -1UL, ping->seqnr, ping->parm);    PingAbort(ping);}static BOOLEAN IcmpCallback(ICMP_DESCR *icmp, CHAIN *chain,            ICMP_HDR *icmpHdr, IP_HDR *ipHdr){    PING_DESCR *ping;        ping = icmp->specific;    if (icmpHdr->seqnr!=ping->seqnr)    {        DnpapMessage(DMC_WARNING, PING_ERROR, "Wrong sequence number");        return TRUE;    }        if (ChainLength(chain)!=ping->length)    {        DnpapMessage(DMC_WARNING, PING_ERROR, "Wrong length");        return TRUE;    }    ping->callback(ping, TimeUsec()-ping->start, ping->seqnr, ping->parm);    PingAbort(ping);    return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -