📄 member.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 + -