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

📄 ping.c

📁 运行于T-engine(采用T-Kernel)之上的例子源代码
💻 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 + -