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

📄 echo.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 <udp.h>#include <ip.h>#include <timer.h>#include <dtime.h>#include "echo.h"static VOID TimerCallback(TIMER_DESCR *timer, ULONG now, void *parm);static BOOLEAN UdpCallback(UDP_DESCR *udp, CHAIN *chain,            UDP_HDR *udpHdr, IP_HDR *ipHdr);ECHO_DESCR *EchoSend(DWORD addr, ULONG timeout, USHORT length, USHORT seqnr,                ECHO_CALLBACK callback, VOID *parm){    UDP_DESCR   *udp;    TIMER_DESCR *timer;    ECHO_DESCR  *echo;    CHAIN       *chain;         UDP_HDR     udpHdr;    IP_HDR      ipHdr;    WORD        *p;      echo=DnpapMalloc(sizeof(ECHO_DESCR));    if (echo==0)    {        return 0;    }    echo->parm=parm;    echo->callback=callback;    echo->seqnr=seqnr;    echo->length=length;    echo->start=0;    echo->timer=0;    echo->udp=0;    udp=DnpapMalloc(sizeof(UDP_DESCR));    if (udp==0)    {        DnpapFree(echo);        return 0;    }    udp->Rcve=UdpCallback;    #ifdef OS2    udp->locPort=UdpAnyPort();     udp->locAddr=IpRouteFindSrc(addr);  #else    udp->locPort=UDP_PORT_ANY;     udp->locAddr=UDP_ADDR_ANY;#endif    udp->remPort=7;    udp->remAddr=addr;    udp->specific=echo;    if (!UdpRegister(udp))    {        DnpapFree(udp);        DnpapFree(echo);        return 0;    }    echo->udp=udp;        timer=TimerRegister(TimerCallback, echo, timeout, TIMER_FOREVER, TIMER_TYPE_SKIP);    if (timer==0)    {        UdpRemove(udp);        DnpapFree(udp);        DnpapFree(echo);        return 0;    }    echo->timer=timer;        chain = ChainAlloc(0,0,length+32,length,32,0);    if (chain==0)    {        TimerRemove(echo->timer);        UdpRemove(echo->udp);        DnpapFree(echo->udp);        DnpapFree(echo);        return 0;    }        p = (WORD *)ChainPush(&chain, 2);    *p = IpH2NWord(echo->seqnr);    ipHdr.src=udp->locAddr;    ipHdr.dst=udp->remAddr;    ipHdr.options=0;    ipHdr.iol=0;    udpHdr.src=udp->locPort;    udpHdr.dst=udp->remPort;        echo->start=TimeUsec();        if (!UdpSend(chain, &udpHdr, &ipHdr, udp))    {        ChainFree(chain);        TimerRemove(echo->timer);        UdpRemove(echo->udp);        DnpapFree(echo->udp);        DnpapFree(echo);        return 0;    }        ChainFree(chain);    return echo;}VOID EchoAbort(ECHO_DESCR *echo){    if (echo==0)        return;        TimerRemove(echo->timer);    UdpRemove(echo->udp);    DnpapFree(echo->udp);    DnpapFree(echo);}static VOID TimerCallback(TIMER_DESCR *timer, ULONG now, void *parm){    ECHO_DESCR *echo;            echo = parm;    echo->callback(echo, -1UL, echo->seqnr, echo->parm);    EchoAbort(echo);}static BOOLEAN UdpCallback(UDP_DESCR *udp, CHAIN *chain,            UDP_HDR *udpHdr, IP_HDR *ipHdr){    ECHO_DESCR *echo;    WORD       *p;        echo = udp->specific;    p = (WORD *)ChainPop(&chain, 2);    if (IpN2HWord(*p)!=echo->seqnr)    {        DnpapMessage(DMC_WARNING, ECHO_ERROR, "Wrong sequence number");        return TRUE;    }        if (ChainLength(chain)!=echo->length)    {        DnpapMessage(DMC_WARNING, ECHO_ERROR, "Wrong length");        return TRUE;    }    echo->callback(echo, TimeUsec()-echo->start, echo->seqnr, echo->parm);    EchoAbort(echo);    return TRUE;}

⌨️ 快捷键说明

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