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