📄 ping.c
字号:
/* ping.C ネットワ〖ク 词白 ping ツ〖ル Copyright (C) 1997-2003 by Personal Media Corporation*/#include "sample.h"
#include <stdlib.h>
#include <string.h>
#include <tstring.h>
#include <btron/bsocket.h>
#define P printf#define EC(er) ((er)>>16)#define MINPKT 64#define MAXPKT 1500#define DEFTMOUT (10 * 1000)#define DEFINTERVAL (1 * 1000)#define ICMP 2#define ICMP_EREP 0#define ICMP_ECHO 8
EXPORT Bool pingok = 0;
/* ミリ擅タイマ〖の艰り叫し*/LOCAL UW CurMsec(void){ UW t; get_etm(&t); return t;}/* ホストアドレスの艰评*/LOCAL W GetHostAddr(B* name, UW *addr){ W c, n, v; UB *ip; B *p, hbuf[HBUFLEN];struct hostent hostent; /* IP アドレス回年( nnn.nnn.nnn.nnn ) のチェック */ ip = (UB*)addr; for (p = name, n = v = 0; (c = *p++) != 0; ) { if (c >= '0' && c <= '9') { if ((v = v * 10 + (c - '0')) > 255) break; } else if (c == '.' && n < 3) { ip[n++] = v; v = 0; } else break; } if (c == 0 && n == 3) { ip[3] = v; return 0; } if ((n = so_gethostbyname(name, &hostent, hbuf)) < ER_OK) return n; memcpy(addr, hostent.h_addr_list[0], sizeof(UW)); return 1;}/* 词白 ping メイン*/EXPORT W ping(VOID){
W ac=1;
W er, n, s; W sflag, tmout, pcnt, tcnt, pktsz; UW st, et, at, interval; TC *tp; B host[128], ipstr[32]; struct sockaddr_in socka; struct pingm { B type; B scode; UH chksum; UH id; UH seq; UH dt[MAXPKT / sizeof(UH)]; } pingm; pktsz = MINPKT; tmout = DEFTMOUT; interval = DEFINTERVAL; pcnt = -1; s = -1; sflag = 0; /* オプションの艰り叫し */ /* ホストアドレスの艰り叫し */// tcstoeucs(host, av);
sprintf(host,"192.168.1.113"); er = GetHostAddr(host, (UW*)&socka.sin_addr.s_addr); if (er < ER_OK) { P("ERR: unknown host %s [%d]\n", host, EC(er)); goto EXIT; } /* 荒りのパラメ〖タの艰り叫し *//* if (ac >= 2) { n = tc_atoi(av[1]); if (sflag != 0) { if ((pktsz = n) > MAXPKT) pktsz = MAXPKT; if (pktsz < MINPKT) pktsz = MINPKT; } else { if (n < 0) n = 0; tmout = n * 1000; } if (ac >= 3) pcnt = tc_atoi(av[2]) - 1; }*/ /* ソケットの栏喇 */ s = so_socket(PF_INET, SOCK_DGRAM, ICMP); if (s < ER_OK) { goto EXIT; } /* コネクションの栏喇 */ socka.sin_family = AF_INET; er = so_connect(s, (SOCKADDR*)&socka, sizeof(socka)); if (er < ER_OK) { goto EXIT; } /* 略ちなしとする */ er = so_fcntl(s, F_SETFL, O_NDELAY); if (er < ER_OK) { goto EXIT; } /* IP アドレス矢机误 */ sprintf(ipstr,"%d.%d.%d.%d",((UB*)&socka.sin_addr.s_addr)[0], ((UB*)&socka.sin_addr.s_addr)[1], ((UB*)&socka.sin_addr.s_addr)[2], ((UB*)&socka.sin_addr.s_addr)[3]); // ping loop for (tmout /= interval, at = 0, tcnt = 0, n = 0; ; n++) { st = CurMsec(); memset((B*)&pingm, 0, sizeof(pingm)); pingm.type = ICMP_ECHO; pingm.seq = htons(n); pingm.dt[0] = pktsz; so_send(s, (B*)&pingm, pktsz, 0); /* ICMP ECHO RESP 减慨 */ for (;;) { er = so_recv(s, (B*)&pingm, sizeof(pingm), 0); et = CurMsec() - st; if (er > 0)
break; if (er < ER_OK && er != EX_WOULDBLOCK) { break; } if (et >= interval) {
er = 0;
break;
} wai_prc(10); }
if (er < ER_OK)
break; if (er == 0) { /* タイムアウト (interval) */ if (++tcnt < tmout)
continue; break; } /* 减慨フレ〖ムチェック */ if (pingm.type != ICMP_EREP) { P("no echo response from %s : ty = %#x sc = %#x\n", host, pingm.type, pingm.scode); break; } if (er != pktsz || pingm.dt[0] != pktsz) { P("bad echo response from %s : pktsz = %d -> %d(%d)\n", host, pktsz, er, pingm.dt[0]); break; } if (sflag == 0) {
pingok = 1; break; } at += et; if ((n % sflag) == 0 || (pcnt >= 0 && n >= pcnt)) P("%d reply from %s <%s> : avg.%d ms\n", n + 1, host, ipstr, at / (n + 1)); if (pcnt >= 0 && n >= pcnt) break; /* 姜位 */ if ((et = CurMsec() - st) < interval) wai_prc(interval - et); tcnt = 0; }EXIT: if (s >= 0) so_close(s); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -