📄 echo.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 + -