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

📄 udp-mm.cc.htm

📁 相关搜索: ns2仿真结果分析 all-awk ns2 ns2 无限网络中awk文件 ... [2.tcl.rar] - 在ns2平台上实现对AODV协议的模拟
💻 HTM
字号:
<html>//// Author:    Jae Chung// File:      udp-mm.cc// Written:   07/17/99 (for ns-2.1b4a)// Modifed:   10/14/01 (for ns-2.1b8a)//#include "udp-mm.h"#include "rtp.h"#include "random.h"#include <string.h>int hdr_mm::offset_;// Mulitmedia Header Class static class MultimediaHeaderClass : public PacketHeaderClass {public:	MultimediaHeaderClass() : PacketHeaderClass("PacketHeader/Multimedia",						    sizeof(hdr_mm)) {		bind_offset(&hdr_mm::offset_);	}} class_mmhdr;// UdpMmAgent OTcl linkage classstatic class UdpMmAgentClass : public TclClass {public:	UdpMmAgentClass() : TclClass("Agent/UDP/UDPmm") {}	TclObject* create(int, const char*const*) {		return (new UdpMmAgent());	}} class_udpmm_agent;// Constructor (with no arg)UdpMmAgent::UdpMmAgent() : UdpAgent(){	support_mm_ = 0;	asm_info.seq = -1;}UdpMmAgent::UdpMmAgent(packet_t type) : UdpAgent(type){	support_mm_ = 0;	asm_info.seq = -1;}// Add Support of Multimedia Application to UdpAgent::sendmsgvoid UdpMmAgent::sendmsg(int nbytes, const char* flags){	Packet *p;	int n, remain; 	if (size_) {		n = (nbytes/size_ + (nbytes%size_ ? 1 : 0));		remain = nbytes%size_;	}	else		printf("Error: UDPmm size = 0\n");	if (nbytes == -1) {		printf("Error:  sendmsg() for UDPmm should not be -1\n");		return;	}	double local_time =Scheduler::instance().clock();	while (n-- > 0) {		p = allocpkt();		if(n==0 && remain>0) hdr_cmn::access(p)->size() = remain;		else hdr_cmn::access(p)->size() = size_;		hdr_rtp* rh = hdr_rtp::access(p);		rh->flags() = 0;		rh->seqno() = ++seqno_;		hdr_cmn::access(p)->timestamp() = 		    (u_int32_t)(SAMPLERATE*local_time);		// to eliminate recv to use MM fields for non MM packets		hdr_mm* mh = hdr_mm::access(p);		mh->ack = 0;		mh->seq = 0;		mh->nbytes = 0;		mh->time = 0;		mh->scale = 0;		// mm udp packets are distinguished by setting the ip		// priority bit to 15 (Max Priority).		if(support_mm_) {			hdr_ip* ih = hdr_ip::access(p);			ih->prio_ = 15;			if(flags) // MM Seq Num is passed as flags				memcpy(mh, flags, sizeof(hdr_mm));		}		// add "beginning of talkspurt" labels (tcl/ex/test-rcvr.tcl)		if (flags && (0 ==strcmp(flags, "NEW_BURST")))			rh->flags() |= RTP_M;		target_->recv(p);	}	idle();}// Support Packet Re-Assembly and Multimedia Applicationvoid UdpMmAgent::recv(Packet* p, Handler*){	hdr_ip* ih = hdr_ip::access(p);	int bytes_to_deliver = hdr_cmn::access(p)->size();	// if it is a MM packet (data or ack)	if(ih->prio_ == 15) { 		if(app_) {  // if MM Application exists			// re-assemble MM Application packet if segmented			hdr_mm* mh = hdr_mm::access(p);			if(mh->seq == asm_info.seq)				asm_info.rbytes += hdr_cmn::access(p)->size();			else {				asm_info.seq = mh->seq;				asm_info.tbytes = mh->nbytes;				asm_info.rbytes = hdr_cmn::access(p)->size();			}			// if fully reassembled, pass the packet to application			if(asm_info.tbytes == asm_info.rbytes) {				hdr_mm mh_buf;				memcpy(&mh_buf, mh, sizeof(hdr_mm));				app_->recv_msg(mh_buf.nbytes, (char*) &mh_buf);			}		}		Packet::free(p);	}	// if it is a normal data packet (not MM data or ack packet)	else { 		if (app_) app_->recv(bytes_to_deliver);		Packet::free(p);	}}

⌨️ 快捷键说明

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