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

📄 member.cc

📁 rtpmon-1.0a7.tar.gz for UNIX like
💻 CC
字号:
/* * Copyright (c) 1996 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement * is hereby granted, provided that the above copyright notice and the * following two paragraphs appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING * OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE * UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * * $Id: member.cc,v 1.10 1997/01/15 22:41:54 aswan Exp $ */#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <netinet/in.h>#include <arpa/inet.h>#include "Tcl.h"#include "member.h"#ifndef HAVE_SNPRINTFextern "C" {    int snprintf(char* buf, int s, const char* fmt, ...);}#endifSenderInfo::SenderInfo() : count_(0), filtloss_(0), jitter_(0), ptr_(0){    memset(lost_, 0, sizeof(lost_));    memset(expected_, 0, sizeof(expected_));}voidSenderInfo::loss(u_int32_t loss, u_int32_t expected){    lost_[ptr_] = loss;    expected_[ptr_] = expected;    ++count_;    ++ptr_;    ptr_ %= LOSS_HISTORY;}u_charSenderInfo::loss(void){    // rather than wait for a second RR before reporting useful    // loss statistics, report the short-term loss rate if only    // a single packet has been received    if (count_ == 1) return filtloss();        int first = count_ >= LOSS_HISTORY ? ptr_ : 0;    int i = (ptr_ + LOSS_HISTORY - 1) % LOSS_HISTORY;    u_int32_t lost = lost_[i] - lost_[first];    u_int32_t expected = expected_[i] - expected_[first];    if (expected == 0)	return 0;    if (lost > expected)	return 100;    return u_char(lost * 100 / expected);}Member::Member(u_int32_t srcid, u_int32_t addr)    : TclObject(0), srcid_(srcid), addr_(addr), locked_(0),      sender_(0), active_(0), pos_(0), badsdes_(0), badlen_(0),      badver_(0), badopt_(0), next_(0), snext_(0), hlink_(0){    memset(&ts_, 0, sizeof(ts_));    for (int i=RTCP_SDES_MAX; i>=0; i--)	sdes_[i] = 0;    size_ = 32;    senders_ = new SenderInfo[size_];}Member::~Member(){    delete[] senders_;}int Member::command(int argc, const char*const* argv){    Tcl& tcl = Tcl::instance();    static char wrk[1024];    int sz = sizeof(wrk);    if (argc == 2) {	if (strcmp(argv[1], "address") == 0) {            struct in_addr addr;	    addr.s_addr = addr_;	    char* tmp = inet_ntoa(addr);	    strncpy(wrk, tmp, sz);	    tcl.result(wrk);	    return(TCL_OK);	}	if (strcmp(argv[1], "info") == 0) {	    char *nargv[10], nargc = 0;		// XXX	    char *argv2[2];	    char *s;	    argv2[0] = "cname";	    s = sdes_[RTCP_SDES_CNAME];	    argv2[1] = s ? s : "?";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "name";	    s = sdes_[RTCP_SDES_NAME];	    argv2[1] = s ? s : "?";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "srcid";	    snprintf(wrk, sizeof(wrk), "%u", srcid_);	    argv2[1] = wrk;	    nargv[nargc++] = Tcl_Merge(2, argv2);	    	    struct in_addr addr;	    addr.s_addr = addr_;	    argv2[0] = "address";	    argv2[1] = inet_ntoa(addr);	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "email";	    s = sdes_[RTCP_SDES_EMAIL];	    argv2[1] = s ? s : "";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "phone";	    s = sdes_[RTCP_SDES_PHONE];	    argv2[1] = s ? s : "";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "loc";	    s = sdes_[RTCP_SDES_LOC];	    argv2[1] = s ? s : "";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "tool";	    s = sdes_[RTCP_SDES_TOOL];	    argv2[1] = s ? s : "";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    argv2[0] = "note";	    s = sdes_[RTCP_SDES_NOTE];	    argv2[1] = s ? s : "";	    nargv[nargc++] = Tcl_Merge(2, argv2);	    strftime(wrk, sizeof(wrk), "%H:%M:%S", localtime(&ts_));	    argv2[0] = "Last control packet";	    argv2[1] = wrk;	    nargv[nargc++] = Tcl_Merge(2, argv2);	    tcl.result(Tcl_Merge(nargc, nargv), TCL_DYNAMIC);	    return (TCL_OK);	}	if (strcmp(argv[1], "name") == 0) {	    if (sdes_[RTCP_SDES_NAME] != 0)		snprintf(wrk, sz, sdes_[RTCP_SDES_NAME]);	    else if (sdes_[RTCP_SDES_CNAME] != 0)		snprintf(wrk, sz, sdes_[RTCP_SDES_CNAME]);	    else		snprintf(wrk, sz, "#%u", srcid_);	    tcl.result(wrk);	    return (TCL_OK);	}	if (strcmp(argv[1], "position") == 0) {	    snprintf(wrk, sz, "%d", pos_);	    tcl.result(wrk);	    return (TCL_OK);	}    } else if (argc == 3) {	if (strcmp(argv[1], "stats") == 0) {	    int n = atoi(argv[2]);	    snprintf(wrk, sz, "%d %d %d", loss(n), filtloss(n), jitter(n));	    tcl.result(wrk);	    return (TCL_OK);	}    }    return (TclObject::command(argc, argv));}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -