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

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

?? show_stats.cc

?? RIP 協(xié)議實現(xiàn)
?? CC
字號:
// -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-// Copyright (c) 2001-2008 XORP, Inc.//// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the "Software")// to deal in the Software without restriction, subject to the conditions// listed in the XORP LICENSE file. These conditions include: you must// preserve this copyright notice, and you cannot mention the copyright// holders in advertising related to the Software without their permission.// The Software is provided WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED. This// notice is a summary of the XORP LICENSE file; the license in that file is// legally binding.#ident "$XORP: xorp/rip/tools/show_stats.cc,v 1.17 2008/07/23 05:11:40 pavlin Exp $"#include <iomanip>#include "rip/rip_module.h"#include "libxorp/xorp.h"#include "libxorp/xlog.h"#include "libxorp/eventloop.hh"#include "libxorp/ipv4.hh"#include "libxorp/ipv6.hh"#include "libxorp/ref_ptr.hh"#include "libxorp/service.hh"#include "libxipc/xrl_std_router.hh"#include "xrl/interfaces/rip_xif.hh"#include "xrl/interfaces/ripng_xif.hh"#include "common.hh"#ifdef HAVE_GETOPT_H#include <getopt.h>#endif// ----------------------------------------------------------------------------// Forward declarationstemplate <typename A>static voidenqueue_address_query(XrlJobQueue&	jq,		      const string&	ifname,		      const string&	vifname,		      const A&		address,		      bool		brief);// ----------------------------------------------------------------------------// Utility methodsstatic voidusage(){    fprintf(stderr,	    "Usage: %s [options] (rip|ripng) [<interface> <vif> <addr>]\n",	    xlog_process_name());    fprintf(stderr, "Options:\n");    fprintf(stderr, "\t -F <finder_host>:<finder_port> "	    "Specify Finder host and port to use.\n");    fprintf(stderr, "\t -T <targetname>                "	    "Specify XrlTarget to query.\n\n");    fprintf(stderr, "\t -b                             "	    "Brief output.");    exit(-1);}template <typename A>static voidprint_header(const string&	ifn,	     const string&	vifn,	     const A&		addr){    cout << endl;    cout << "* RIP on " << ifn << " " << vifn << " " << addr.str() << endl;}static voidpretty_print_status(const string& status){    cout << "  Status: " << status << endl << endl;}static voidpretty_print_counters(const XrlAtomList* descriptions,		      const XrlAtomList* values){    static const uint32_t COL1 = 32;    static const uint32_t COL2 = 16;    // Save flags    ios::fmtflags fl = cout.flags();    cout.flags(ios::left);    cout << "  ";    cout << setw(COL1) << "Counter" << setw(0) << " ";    cout.flags(ios::right);    cout << setw(COL2) << "Value" << endl;    cout.flags(ios::left);    cout << "  ";    cout << setw(COL1) << string(COL1, '-') << setw(0) << " ";    cout.flags(ios::right);    cout << setw(COL2) << string(COL2, '-') << endl;    for (size_t i = 0; i != descriptions->size(); ++i) {	const XrlAtom& d = descriptions->get(i);	const XrlAtom& v = values->get(i);	cout.flags(ios::left);	cout << setw(0) << "  ";	// NB we use string.c_str() here as GCC's string ostream renderer	// seems to ignore the field width.	cout << setw(COL1) << d.text().c_str();	cout << setw(0) << " ";	cout.flags(ios::right);	cout << setw(COL2) << v.uint32() << endl;    }    // Restore flags    cout.flags(fl);}// ----------------------------------------------------------------------------// GetListAtom - extract argument of templatized type from XrlAtomList// [ This should probably be part of libxipc/xrl_atom_list.hh ]template <typename A>struct GetListAtom {    GetListAtom(const XrlAtomList& xal) : _xal(xal) {}    GetListAtom(const XrlAtomList* pxal) : _xal(*pxal) {}    const A& at(uint32_t index);private:    const XrlAtomList& _xal;};template <>inline const IPv4&GetListAtom<IPv4>::at(uint32_t index){    return _xal.get(index).ipv4();}template <>const IPv6&GetListAtom<IPv6>::at(uint32_t index){    return _xal.get(index).ipv6();}template <>const string&GetListAtom<string>::at(uint32_t index){    return _xal.get(index).text();}// ----------------------------------------------------------------------------// Job classes and relatedtemplate <typename A>class XrlAddrJobBase : public XrlJobBase {public:    XrlAddrJobBase(XrlJobQueue& 	jq,		   const string& 	ifname,		   const string& 	vifname,		   const A& 		addr)	: XrlJobBase(jq), _ifname(ifname), _vifname(vifname), _addr(addr)    {}    const string& ifname() const 		{ return _ifname; }    const string& vifname()const		{ return _vifname; }    const A& addr() const			{ return _addr;	}protected:    string	_ifname;    string	_vifname;    A		_addr;};/** * Class to print header. */template <typename A>class PrintAddress : public XrlAddrJobBase<A>{public:    PrintAddress(XrlJobQueue&	jq,		 const string&	ifname,		 const string&	vifname,		 const A&	addr)	: XrlAddrJobBase<A>(jq, ifname, vifname, addr)    {}    bool dispatch()    {	print_header(this->ifname(), this->vifname(), this->addr());	this->queue().dispatch_complete(XrlError::OKAY(), this);	return true;    }};/** * Invoke Xrl to get address stats on RIP address and pretty print result. */template <typename A>class GetAddressStats : public XrlAddrJobBase<A> {public:    GetAddressStats(XrlJobQueue&	jq,		    const string&	ifname,		    const string&	vifname,		    const A&		addr)	: XrlAddrJobBase<A>(jq, ifname, vifname, addr)    {}    bool dispatch();protected:    void    cmd_callback(const XrlError&	xe,		 const XrlAtomList*	descriptions,		 const XrlAtomList*	values)    {	if (xe == XrlError::OKAY()) {	    pretty_print_counters(descriptions, values);	}	this->queue().dispatch_complete(xe, this);    }};template <>boolGetAddressStats<IPv4>::dispatch(){    XrlRipV0p1Client cl(queue().sender());    return cl.send_get_counters(queue().target().c_str(),				this->ifname(), this->vifname(), this->addr(),				callback(this,					 &GetAddressStats<IPv4>::cmd_callback)				);}template <>boolGetAddressStats<IPv6>::dispatch(){    XrlRipngV0p1Client cl(queue().sender());    return cl.send_get_counters(queue().target().c_str(),				this->ifname(), this->vifname(), this->addr(),				callback(this,					 &GetAddressStats<IPv6>::cmd_callback)				);}/** * Invoke Xrl to get address state on RIP address and pretty print result. */template <typename A>class GetAddressStatus : public XrlAddrJobBase<A> {public:    GetAddressStatus(XrlJobQueue&	jq,		     const string&	ifname,		     const string&	vifname,		     const A&		addr)	: XrlAddrJobBase<A>(jq, ifname, vifname, addr)    {}    bool dispatch();protected:    void    cmd_callback(const XrlError&	xe,		 const string*		status)    {	if (xe == XrlError::OKAY()) {	    pretty_print_status(*status);	}	this->queue().dispatch_complete(xe, this);    }};template <>boolGetAddressStatus<IPv4>::dispatch(){    XrlRipV0p1Client cl(queue().sender());    return cl.send_rip_address_status(queue().target().c_str(),		this->ifname(), this->vifname(), this->addr(),		callback(this, &GetAddressStatus<IPv4>::cmd_callback)		);}template <>boolGetAddressStatus<IPv6>::dispatch(){    XrlRipngV0p1Client cl(queue().sender());    return cl.send_rip_address_status(queue().target().c_str(),		this->ifname(), this->vifname(), this->addr(),		callback(this, &GetAddressStatus<IPv6>::cmd_callback)		);}/** * Invoke Xrl to get all addresses, which we then use to get the counters * for to pretty print result. */template <typename A>class GetAllAddressStats : public XrlJobBase {public:    GetAllAddressStats(XrlJobQueue& jq, bool brief)	: XrlJobBase(jq), _brief(brief)    {}    bool dispatch();protected:    void    cmd_callback(const XrlError&	xe,		 const XrlAtomList*	ifnames,		 const XrlAtomList*	vifnames,		 const XrlAtomList*	addrs)    {	if (xe == XrlError::OKAY()) {	    for (size_t i = 0; i < ifnames->size(); i++) {		const string& 	ifn 	  = ifnames->get(i).text();		const string& 	vifn 	  = vifnames->get(i).text();		const A& 	addr 	  = GetListAtom<A>(addrs).at(i);		enqueue_address_query(queue(), ifn, vifn, addr, _brief);	    }	}	queue().dispatch_complete(xe, this);    }private:    bool _brief;};template <>boolGetAllAddressStats<IPv4>::dispatch(){    XrlRipV0p1Client cl(queue().sender());    return cl.send_get_all_addresses(queue().target().c_str(),		callback(this, &GetAllAddressStats<IPv4>::cmd_callback)				     );}template <>boolGetAllAddressStats<IPv6>::dispatch(){    XrlRipngV0p1Client cl(queue().sender());    return cl.send_get_all_addresses(queue().target().c_str(),		callback(this, &GetAllAddressStats<IPv6>::cmd_callback)				     );}template <typename A>voidenqueue_address_query(XrlJobQueue& 	jq,		      const string& 	ifname,		      const string& 	vifname,		      const A& 		addr,		      bool 		brief){    jq.enqueue(new PrintAddress<A>(jq, ifname, vifname, addr));    jq.enqueue(new GetAddressStatus<A>(jq, ifname, vifname, addr));    if (brief == false)	jq.enqueue(new GetAddressStats<A>(jq, ifname, vifname, addr));}// ----------------------------------------------------------------------------// Mainintmain(int argc, char* const argv[]){    //    // Initialize and start xlog    //    xlog_init(argv[0], NULL);    xlog_set_verbose(XLOG_VERBOSE_LOW);         // Least verbose messages    xlog_level_set_verbose(XLOG_LEVEL_ERROR, XLOG_VERBOSE_HIGH);    xlog_add_default_output();    xlog_start();    try {	bool		do_run 	    = true;	bool		brief 	    = false;	string  	finder_host = FinderConstants::FINDER_DEFAULT_HOST().str();        uint16_t        finder_port = FinderConstants::FINDER_DEFAULT_PORT();	string		xrl_target;	int ch;	while ((ch = getopt(argc, argv, "bF:T:")) != -1) {	    switch (ch) {	    case 'b':		brief = true;		break;	    case 'F':		do_run = parse_finder_args(optarg, finder_host, finder_port);		break;	    case 'T':		xrl_target = optarg;		break;	    default:		usage();		do_run = false;	    }	}	argc -= optind;	argv += optind;	if (argc == 0) {	    usage();	}	uint32_t ip_version = rip_name_to_ip_version(argv[0]);	if (ip_version == 0) {	    cerr << "Bad ip version (" << ip_version << ")" << endl;	    usage();	}	argc -= 1;	argv += 1;	if (xrl_target.empty()) {	    const char* xt = default_xrl_target(ip_version);	    if (xt == 0) {		cerr << "Bad xrl target (" << ip_version << ")" << endl;		usage();	    }	    xrl_target = xt;	}	if (do_run) {	    EventLoop e;	    XrlJobQueue job_queue(e, finder_host, finder_port, xrl_target);	    if (argc == 3) {		if (ip_version == 4) {		    enqueue_address_query(job_queue,					  argv[0], argv[1], IPv4(argv[2]),					  brief);		} else if (ip_version == 6) {		    enqueue_address_query(job_queue,					  argv[0], argv[1], IPv6(argv[2]),					  brief);		}	    } else if (argc == 0) {		if (ip_version == 4) {		    job_queue.enqueue(new GetAllAddressStats<IPv4>(job_queue,								   brief));		} else if (ip_version == 6) {		    job_queue.enqueue(new GetAllAddressStats<IPv6>(job_queue,								   brief));		}	    } else {		cerr << "Expected (rip|ripng) (all|<ifname> <vifname> <address>)\n";		usage();	    }	    job_queue.startup();	    while (job_queue.status() != SERVICE_SHUTDOWN) {		if (job_queue.status() == SERVICE_FAILED) {		    cerr << "Failed: " << job_queue.status_note() << endl;		    break;		}		e.run();	    }	}    } catch (...) {	xorp_print_standard_exceptions();    }    //    // Gracefully stop and exit xlog    //    xlog_stop();    xlog_exit();    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本va午夜在线电影| 亚洲欧洲99久久| 91丨九色丨国产丨porny| 亚洲国产视频网站| 国产亚洲综合色| 欧美一区二区三区日韩| 97精品国产露脸对白| 黑人巨大精品欧美黑白配亚洲 | 亚洲图片欧美色图| 久久久久久久久伊人| 欧美日韩国产高清一区二区三区| 国产不卡在线播放| 喷白浆一区二区| 亚洲一区二区三区四区的| 亚洲国产精华液网站w| 精品国产麻豆免费人成网站| 欧美日韩国产一二三| 99视频精品全部免费在线| 国内成人精品2018免费看| 亚洲va欧美va国产va天堂影院| 亚洲图片你懂的| 国产精品美女久久久久久2018| 精品免费国产二区三区| 5月丁香婷婷综合| 在线观看区一区二| 99精品久久免费看蜜臀剧情介绍| 国产乱妇无码大片在线观看| 精品一区二区三区在线播放| 视频精品一区二区| 亚洲成av人片在线| 亚洲线精品一区二区三区八戒| 国产精品高清亚洲| 中文字幕精品综合| 国产精品麻豆久久久| 欧美激情一区二区三区蜜桃视频| 久久综合九色欧美综合狠狠 | 欧美极品少妇xxxxⅹ高跟鞋| 日韩午夜激情视频| 欧美一级高清片在线观看| 91麻豆精品国产| 欧美一区二区网站| 欧美成人乱码一区二区三区| 日韩视频一区二区在线观看| 日韩一级精品视频在线观看| 日韩欧美中文字幕一区| 日韩欧美在线影院| 精品国偷自产国产一区| 久久久久久综合| 国产午夜三级一区二区三| 欧美极品少妇xxxxⅹ高跟鞋 | 懂色一区二区三区免费观看 | 精品免费99久久| 欧美成人福利视频| 久久女同性恋中文字幕| 久久久国产精华| 中文字幕一区免费在线观看| 亚洲三级免费电影| 亚洲一区二区综合| 日本午夜精品一区二区三区电影| 精品一区二区三区视频| 国产精品一级二级三级| 99久久免费视频.com| 欧美亚洲一区二区在线| 666欧美在线视频| 久久婷婷色综合| 最近中文字幕一区二区三区| 亚洲一区二区三区四区中文字幕| 日韩 欧美一区二区三区| 国产精品99久久久久久宅男| 99国产精品久久久| 在线播放中文字幕一区| 久久―日本道色综合久久| 国产精品大尺度| 日本一道高清亚洲日美韩| 国产在线视频一区二区三区| 99久久精品国产一区| 欧美精品色一区二区三区| 久久久久国产一区二区三区四区| 国产精品视频看| 亚洲成人av一区二区| 国产电影一区二区三区| 欧美这里有精品| 久久免费美女视频| 亚洲第一电影网| 国产自产高清不卡| 91高清视频在线| 久久婷婷久久一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 狠狠色伊人亚洲综合成人| 91蜜桃在线观看| 久久综合九色综合欧美就去吻| 一区二区三区国产精品| 国产精品一区二区三区四区| 欧美视频在线观看一区二区| 中文字幕高清一区| 另类欧美日韩国产在线| 日本久久精品电影| 久久久久国产免费免费| 日韩国产成人精品| 91麻豆高清视频| 精品国产成人系列| 午夜精品一区二区三区三上悠亚| 成人精品一区二区三区四区| 日韩精品一区二区三区在线观看 | 国产成人综合在线观看| 欧美精品在线观看播放| 中文字幕亚洲一区二区av在线| 久草热8精品视频在线观看| 欧美视频精品在线观看| 最新国产成人在线观看| 国产精品一线二线三线精华| 欧美一区二区三区免费大片 | 六月丁香婷婷色狠狠久久| 在线观看av一区| 亚洲欧美综合色| 高清视频一区二区| 精品少妇一区二区三区免费观看| 亚洲国产色一区| 日本高清不卡在线观看| 1000精品久久久久久久久| 丁香桃色午夜亚洲一区二区三区| 欧美tk—视频vk| 免费成人在线网站| 777午夜精品免费视频| 亚洲一区二区免费视频| 一本久久a久久精品亚洲| 亚洲四区在线观看| eeuss鲁片一区二区三区| 亚洲国产精品激情在线观看| 国产一区999| 精品成人私密视频| 久久成人精品无人区| 欧美成人一区二区三区片免费 | 色呦呦一区二区三区| 国产精品久久久久婷婷二区次| 国产一区二区三区香蕉| 26uuu亚洲综合色| 国产精品一卡二卡| 国产人伦精品一区二区| 国产成人精品一区二区三区四区 | 久久先锋影音av鲁色资源网| 极品销魂美女一区二区三区| 精品久久久久香蕉网| 韩国午夜理伦三级不卡影院| 久久综合999| 大陆成人av片| 亚洲欧美在线aaa| 日本韩国精品一区二区在线观看| 亚洲综合999| 欧美日韩美少妇| 日韩av一级电影| 欧美成人一区二区三区| 国产乱理伦片在线观看夜一区| 国产精品色婷婷| 一本色道**综合亚洲精品蜜桃冫| 亚洲一区二区三区四区五区黄| 在线电影一区二区三区| 黄一区二区三区| 亚洲欧洲精品一区二区三区不卡| 色综合欧美在线视频区| 日本中文字幕不卡| 久久女同互慰一区二区三区| 99久久精品国产一区| 亚洲成人av中文| 久久久美女艺术照精彩视频福利播放| 成人一级片网址| 婷婷开心久久网| 久久久久国产精品厨房| 色偷偷久久一区二区三区| 欧美aⅴ一区二区三区视频| 国产日韩影视精品| 欧洲在线/亚洲| 国产乱码精品一品二品| 亚洲国产一区视频| 久久天天做天天爱综合色| 91色婷婷久久久久合中文| 日韩成人一级大片| 国产精品久久久久一区二区三区 | 成人精品小蝌蚪| 日韩精品一二三四| 中文字幕乱码亚洲精品一区| 欧美日韩精品一区二区三区 | 国产视频一区在线播放| 在线观看不卡视频| 国产美女主播视频一区| 亚洲一区二区三区四区五区中文 | 日韩av在线免费观看不卡| 日本一区二区免费在线| 欧美军同video69gay| 丰满少妇在线播放bd日韩电影| 亚洲午夜久久久久久久久电影院 | 亚洲色图欧美激情| 日韩免费电影一区| 91蝌蚪国产九色| 国产精品一区二区三区网站| 婷婷综合另类小说色区| 国产精品国产三级国产普通话三级| 91精品国产麻豆| 91免费视频网址| 成人黄色小视频|