亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hop.c

?? 很好的TCP_IP協議源代碼分析,很適用很好
?? C
字號:

#include <stdio.h>
#include <string.h>
#include "global.h"
#include "mbuf.h"
#include "usock.h"
#include "socket.h"
#include "session.h"
#include "timer.h"
#include "proc.h"
#include "netuser.h"
#include "domain.h"
#include "commands.h"
#include "tty.h"
#include "cmdparse.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"
#include "hardware.h"

#define HOPMAXQUERY	5		/* Max# queries each TTL value */
static uint16 Hoprport = 32768+666;	/* funny port for udp probes */
#define HOP_HIGHBIT	32768		/* Mask to check ICMP msgs */


#define HOPTRACE	1		/* Enable HOP tracing */
#ifdef HOPTRACE
static int Hoptrace = 0;
static int hoptrace(int argc,char *argv[],void *p);
#endif


static unsigned  short Hopmaxttl  = 30;		/* max attempts */
static unsigned  short Hopmaxwait = 5;		/* secs timeout each attempt */
static unsigned  short Hopquery   = 3;		/* #probes each attempt */

static int hopcheck(int argc,char *argv[],void *p);
static int hopttl(int argc,char *argv[],void *p);
static int hokwait(int argc,char *argv[],void *p);
static int hopnum(int argc,char *argv[],void *p);
static int geticmp(int s,uint16 lport,uint16 fport,
	int32 *sender,char *type,char *code);
static int keychar(int c);

static struct cmds Hopcmds[] = {
	"check",	hopcheck,	2048,	2,	"check <host>",
	"maxttl",	hopttl,		0,	0,	NULL,
	"maxwait",	hokwait,	0,	0,	NULL,
	"queries",	hopnum,		0,	0,	NULL,
#ifdef HOPTRACE
	"trace",	hoptrace,	0,	0,	NULL,
#endif
	NULL,
};

/* attempt to trace route to a remote host */
int
dohop(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return subcmd(Hopcmds,argc,argv,p);
}

/* Set/show # queries sent each TTL value */
static int
hopnum(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	uint16 r;
	uint16 x = Hopquery;
	r = setshort(&x,"# queries each attempt",argc,argv);
	if ((x <= 0)||(x > HOPMAXQUERY)) {
		printf("Must be  0 < x <= %d\n",HOPMAXQUERY);
		return 0;
	} else {
		Hopquery = x;
	}
    return (int)r;
}
#ifdef HOPTRACE
/* Set/show tracelevel */
static int
hoptrace(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setbool(&Hoptrace,"HOPCHECK tracing",argc,argv);
}
#endif
/* Set/show maximum TTL value for a traceroute query */
static int
hopttl(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	uint16 r;
	uint16 x = Hopmaxttl;
	r = setshort(&x,"Max attempts to reach host",argc,argv);
	if ((x <= 0)||(x > 255)) {
		printf("Must be  0 < x <= 255\n");
		return 0;
	} else {
		Hopmaxttl = x;
	}
    return (int)r;
}
/* Set/show #secs until timeout for a traceroute query */
static int
hokwait(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	uint16 r;
	uint16 x = Hopmaxwait;
	r = setshort(&x,"# secs to wait for reply to query",argc,argv);
	if (x <= 0) {
		printf("Must be >= 0\n");
		return 0;
	} else {
		Hopmaxwait = x;
	}
    return (int)r;
}

/* send probes to trace route of a remote host */
static int
hopcheck(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	struct session *sp;		/* Session for trace output */
	int s;				/* Socket for queries */
	int s1;				/* Raw socket for replies */
	struct socket lsocket;		/* Local socket sending queries */
	struct socket rsocket;		/* Final destination of queries */
	int32 cticks;			/* Timer for query replies */
	int32 icsource;			/* Sender of last ICMP reply */
	char ictype;			/* ICMP type last ICMP reply */
	char iccode;			/* ICMP code last ICMP reply */
	int32 lastaddr;			/* Sender of previous ICMP reply */
	struct sockaddr_in sock;
	register struct usock *usp;
	register struct sockaddr_in *sinp;
	unsigned char sndttl, q;
	int tracedone = 0;
	int ilookup = 1;		/* Control of inverse domain lookup */
	int c;
	extern int optind;
	char *hostname;
	int save_trace;
	int user_reset = 0;

	optind = 1;
	while((c = getopt(argc,argv,"n")) != EOF){
		switch(c){
		case 'n':
			ilookup = 0;
			break;
		}
	}
	hostname = argv[optind];
	/* Allocate a session descriptor */
	if((sp = newsession(Cmdline,HOP,1)) == NULL){
		printf("Too many sessions\n");
		keywait(NULL,1);
		return 1;
	}
	sp->inproc = keychar;
	s = -1;

	/* Setup UDP socket to remote host */
	sock.sin_family = AF_INET;
	sock.sin_port = Hoprport;
	printf("Resolving %s... ",hostname);
	if((sock.sin_addr.s_addr = resolve(hostname)) == 0){
		printf("unknown\n",hostname);
		keywait(NULL,1);
		freesession(sp);
		return 1;
	}

	/* Open socket to remote host */
	printf("%s ",psocket((struct sockaddr *)&sock));
	if((s = socket(AF_INET,SOCK_DGRAM,0)) == -1){
		printf("Can't create udp socket\n");
		keywait(NULL,1);
		freesession(sp);
		return 1;
	}
	if(connect(s,(struct sockaddr *)&sock,sizeof(sock)) == -1){
		printf("Connect failed\n");
		keywait(NULL,1);
		freesession(sp);
		return 1;
	}
	if((s1 = socket(AF_INET,SOCK_RAW,ICMP_PTCL)) == -1){
		printf("Can't create raw socket\n");
		keywait(NULL,1);
		close(s);
		freesession(sp);
		return 1;
	}
	printf("\n");
	/* turn off icmp tracing while hop-checking */
	save_trace = Icmp_trace;
	Icmp_trace = 0;

	/* Setup structures to send queries */
	/* Retrieve socket details for user socket control block */
	usp = itop(s);
	sinp = (struct sockaddr_in *)usp->name;
	lsocket.address = sinp->sin_addr.s_addr;
	lsocket.port = sinp->sin_port;
	sinp = (struct sockaddr_in *)usp->peername;
	rsocket.address = sinp->sin_addr.s_addr;

	/* Send queries with increasing TTL; start with TTL=1 */
	if (Hoptrace)
		logmsg(s,"HOPCHECK start trace to %s\n",sp->name);
	for (sndttl=1; (sndttl < Hopmaxttl); ++sndttl, sinp->sin_port++) {
		/* Increment funny UDP port number each round */
		rsocket.port = sinp->sin_port;
		printf("%3d:",sndttl);
		lastaddr = (int32)0;
		/* Send a round of queries */
		for (q=0; (q < Hopquery); ++q) {
			struct mbuf *bp;
			bp = ambufw(0);
			send_udp(&lsocket,&rsocket,0,sndttl,&bp,0,0,0);
			cticks = msclock();
			kalarm( ((long)Hopmaxwait*1000L) );

			/* Wait for a reply to our query */
			if(geticmp(s1,lsocket.port,rsocket.port,
			 &icsource,&ictype,&iccode) == -1){
				if(errno != EALARM){
					user_reset = 1;
					goto done;	/* User reset */
				}
				/* Alarm rang, give up waiting for replies */
				printf(" ***");
				continue;
			}
			/* Save #ticks taken for reply */
                        cticks = msclock() - cticks;
			/* Report ICMP reply */
			if (icsource != lastaddr) {
				struct rr *save_rrlp, *rrlp;

				if(lastaddr != (int32)0)
					printf("\n    ");
				printf(" %-15s",inet_ntoa(icsource));
				if(ilookup){
					for(rrlp = save_rrlp = inverse_a(icsource);
					    rrlp != NULL;
					    rrlp = rrlp->next){
						if(rrlp->rdlength > 0){
							switch(rrlp->type){
							case TYPE_PTR:
								printf(" %s", rrlp->rdata.name);
								goto got_name;
							case TYPE_A:
								printf(" %s", rrlp->name);
								goto got_name;
							}
#ifdef notdef
							if(rrlp->next != NULL)
								printf("\n%20s"," ");
#endif
						}
					}
					got_name: ;
					free_rr(save_rrlp);

				}
				lastaddr = icsource;
			}
                        printf(" (%ld ms)",cticks);
#ifdef HOPTRACE
			if (Hoptrace)
				logmsg(s,
				    "(hopcheck) ICMP from %s (%ldms) %s %s",
				    inet_ntoa(icsource),
				    cticks,
				    Icmptypes[ictype],
				    ((ictype == ICMP_TIME_EXCEED)?Exceed[iccode]:Unreach[iccode]));
#endif

			/* Check type of reply */
			if (ictype == ICMP_TIME_EXCEED)
				continue;
			/* Reply was: destination unreachable */
			switch(iccode) {
			case ICMP_PORT_UNREACH:
				++tracedone;
				break;
			case ICMP_NET_UNREACH:
				++tracedone;
				printf(" !N");
				break;
			case ICMP_HOST_UNREACH:
				++tracedone;
				printf(" !H");
				break;
			case ICMP_PROT_UNREACH:
				++tracedone;
				printf(" !P");
				break;
			case ICMP_FRAG_NEEDED:
				++tracedone;
				printf(" !F");
				break;
			case ICMP_ROUTE_FAIL:
				++tracedone;
				printf(" !S");
				break;
                        case ICMP_ADMIN_PROHIB:
                                ++tracedone;
                                printf(" !A");
                                break;
                        default:
                                printf(" !?");
                                break;
			}
		}
		/* Done with this round of queries */
		kalarm((long)0);
		printf("\n");
		/* Check if we reached remote host this round */
		if (tracedone != 0)
			break;
	}

	/* Done with traceroute */
done:	close(s);
	s = -1;
	close(s1);
	if(user_reset)
		printf("\n");	/* May have been in middle of line */
	printf("traceroute done: ");
	Icmp_trace = save_trace;
	if(user_reset){
		printf("user abort\n");
	} else if (sndttl >= Hopmaxttl) {
		printf("!! maximum TTL exceeded\n");
	} else if ((icsource == rsocket.address)
		    &&(iccode == ICMP_PORT_UNREACH)) {
		printf("normal (%s %s)\n",
			Icmptypes[ictype],Unreach[iccode]);
	} else {
		printf("!! %s %s\n",
			Icmptypes[ictype],Unreach[iccode]);
	}
#ifdef HOPTRACE
	if (Hoptrace)
		logmsg(s,"HOPCHECK to %s done",sp->name);
#endif
	keywait(NULL,1);
	freesession(sp);
	return 0;
}

/* Hop check session keyboard upcall routine -- handles ^C */
static int
keychar(c)
int c;
{
	switch(c){
	case CTLC:
		alert(Current->proc,EABORT);
		return 0;
	}
	return 1;
}

/* Read raw network socket looking for ICMP messages in response to our
 * UDP probes
 */
static int
geticmp(s,lport,fport,sender,type,code)
int s;
uint16 lport;
uint16 fport;
int32 *sender;
char *type,*code;
{
	int size;
	struct icmp icmphdr;
	struct ip iphdr;
	struct udp udphdr;
	struct mbuf *bp;
	struct sockaddr_in sock;

	for(;;){
		size = sizeof(sock);
		if(recv_mbuf(s,&bp,0,(struct sockaddr *)&sock,&size) == -1)
			return -1;
		/* It's an ICMP message, let's see if it's interesting */
		ntohicmp(&icmphdr,&bp);
		if((icmphdr.type != ICMP_TIME_EXCEED ||
		 icmphdr.code != ICMP_TTL_EXCEED)
		 && icmphdr.type != ICMP_DEST_UNREACH){
			/* We're not interested in these */
			free_p(&bp);
			continue;
		}
		ntohip(&iphdr,&bp);
		if(iphdr.protocol != UDP_PTCL){
			/* Not UDP, so can't be interesting */
			free_p(&bp);
			continue;
		}
		ntohudp(&udphdr,&bp);
		if(udphdr.dest != fport || udphdr.source != lport){
			/* Not from our hopcheck session */
			free_p(&bp);
			continue;
		}
		/* Passed all of our checks, so return it */
		*sender = sock.sin_addr.s_addr;
		*type = icmphdr.type;
		*code = icmphdr.code;
		free_p(&bp);
		return 0;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人综合视频| 久久综合一区二区| 欧美激情中文不卡| 日本不卡免费在线视频| 91亚洲精品一区二区乱码| 2022国产精品视频| 石原莉奈在线亚洲三区| 色噜噜夜夜夜综合网| 久久久久久久久久久99999| 亚洲444eee在线观看| 91热门视频在线观看| 日本一区二区综合亚洲| 青娱乐精品视频在线| 欧美午夜在线一二页| 亚洲欧洲综合另类在线| 高清成人在线观看| 久久久综合激的五月天| 精品一区二区在线视频| 日韩欧美一二三四区| 天天爽夜夜爽夜夜爽精品视频| 一本色道亚洲精品aⅴ| 中文一区二区完整视频在线观看| 国产永久精品大片wwwapp| 欧美一级片免费看| 免费高清成人在线| 日韩精品中文字幕一区| 免费看日韩a级影片| 88在线观看91蜜桃国自产| 亚洲高清视频的网址| 欧美日韩久久久| 天天综合色天天| 欧美午夜在线一二页| 亚洲综合色区另类av| 欧美性受xxxx| 午夜精品视频在线观看| 91精品国产免费久久综合| 久久国产精品区| 亚洲精品一线二线三线| 国产成人一级电影| 国产精品久久久久久久久久久免费看| 国产在线不卡一卡二卡三卡四卡| 欧美精品一区二区久久婷婷| 国产精品资源网| 国产精品国模大尺度视频| 一本色道a无线码一区v| 亚洲愉拍自拍另类高清精品| 欧美日韩国产一级二级| 日韩av电影免费观看高清完整版| 日韩美女天天操| 国产99久久久国产精品免费看| 18欧美亚洲精品| 欧美日本免费一区二区三区| 另类中文字幕网| 国产精品久久久久毛片软件| 欧美伊人久久大香线蕉综合69 | 国产精品污www在线观看| av不卡免费电影| 亚洲一区二区高清| 337p粉嫩大胆噜噜噜噜噜91av| 成人福利视频在线看| 亚洲国产欧美在线| www国产成人| 色综合 综合色| 美腿丝袜亚洲色图| 国产精品理伦片| 制服丝袜国产精品| 成人av网在线| 蜜桃91丨九色丨蝌蚪91桃色| 中文字幕一区二区三区蜜月| 3d动漫精品啪啪1区2区免费| 成人小视频在线| 蜜臀av在线播放一区二区三区 | 亚洲观看高清完整版在线观看| 日韩小视频在线观看专区| 不卡高清视频专区| 奇米影视在线99精品| 亚洲视频一区二区免费在线观看| 6080日韩午夜伦伦午夜伦| 成人久久视频在线观看| 天天免费综合色| 亚洲人成7777| 国产亚洲综合色| 日韩一区二区三区视频在线观看| 97久久超碰国产精品电影| 激情图区综合网| 亚洲国产美女搞黄色| 国产精品护士白丝一区av| 精品久久五月天| 欧美电影在哪看比较好| 99久久99久久免费精品蜜臀| 国产剧情一区二区三区| 日韩av电影免费观看高清完整版在线观看| 国产精品全国免费观看高清| 26uuu色噜噜精品一区| 欧美日韩国产一级片| 色美美综合视频| a亚洲天堂av| 成人永久免费视频| 国产一区二区福利视频| 久久国内精品视频| 天天免费综合色| 亚洲一区二区三区四区不卡| 亚洲欧美偷拍三级| 亚洲日本中文字幕区| 国产欧美日韩麻豆91| 久久久久久久久久久99999| 日韩美女主播在线视频一区二区三区 | 亚洲成人av电影| 亚洲色图视频网| 自拍偷拍亚洲激情| 国产精品久久夜| 国产精品久久久久久久久图文区 | 亚洲成人精品一区二区| 亚洲男人的天堂网| 亚洲欧美日韩电影| 亚洲美女视频在线| 夜夜精品视频一区二区| 一区二区在线观看视频 | 亚洲1区2区3区4区| 天天综合天天综合色| 视频在线观看国产精品| 午夜精品久久久久久久蜜桃app| 亚洲一区二区欧美激情| 午夜欧美视频在线观看| 日本美女一区二区| 久久99精品久久久| 国产 日韩 欧美大片| 色婷婷综合久久久中文字幕| 色婷婷亚洲一区二区三区| 色哟哟一区二区| 91精品国产综合久久久久久久| 欧美第一区第二区| 中文字幕精品一区| 一区二区三区 在线观看视频| 无吗不卡中文字幕| 国内精品自线一区二区三区视频| 粉嫩嫩av羞羞动漫久久久| 色综合久久综合网| 91精品国产综合久久香蕉麻豆| 精品日产卡一卡二卡麻豆| 国产精品三级在线观看| 亚洲风情在线资源站| 久久电影网站中文字幕| 粉嫩在线一区二区三区视频| 在线亚洲+欧美+日本专区| 91麻豆精品国产91久久久久久久久 | 欧美自拍丝袜亚洲| 精品国产a毛片| 亚洲精品国产a久久久久久| 麻豆精品新av中文字幕| 成人黄色综合网站| 91精品国产乱| 综合久久综合久久| 激情六月婷婷综合| 一本色道亚洲精品aⅴ| 精品福利一二区| 亚洲国产成人av网| 成人小视频免费在线观看| 欧美三级韩国三级日本一级| 亚洲精品一区二区精华| 亚洲一二三四久久| 丁香婷婷综合色啪| 日韩一级大片在线观看| 亚洲视频资源在线| 国产盗摄女厕一区二区三区 | 色先锋久久av资源部| 精品国产不卡一区二区三区| 亚洲一区二区在线观看视频 | 国产精品一区久久久久| 欧美美女一区二区| 亚洲欧美日韩国产一区二区三区| 麻豆精品一二三| 欧美久久久久久久久中文字幕| 中文字幕欧美一区| 国产精品18久久久久久久久| 欧美精品tushy高清| 亚洲视频一区二区免费在线观看| 黄色精品一二区| 欧美一二三区精品| 香港成人在线视频| 在线影院国内精品| 欧美国产精品一区二区三区| 麻豆91在线播放| 91精品国产欧美日韩| 亚洲成人1区2区| 欧美日韩一级黄| 亚洲午夜在线视频| 91国偷自产一区二区使用方法| ...中文天堂在线一区| 波多野结衣中文一区| 欧美激情一区二区三区全黄| 国产精品18久久久久久久久| 精品福利一二区| 国内成+人亚洲+欧美+综合在线| 欧美v国产在线一区二区三区| 日本欧美韩国一区三区| 日韩欧美美女一区二区三区| 麻豆精品视频在线观看免费| 精品国产免费一区二区三区四区| 日本不卡视频在线观看|