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

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

?? c-sparsifier.cc

?? clustering for ns-2 simulation
?? CC
?? 第 1 頁 / 共 2 頁
字號:

/**
 * Copyright (c) 2006 Michele Mastrogiovanni.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */

////////////////
// NS Headers //
////////////////
#include "c-sparsifier.h"
#include "random.h"
#include "gridkeeper.h"
#include <algorithm>

#include "Separator.h"

///////////////////////////////////
// Parte di dichiarazione comune //
///////////////////////////////////

int hdr_c_sparsifier::offset_;

int CSPARSIFIER_Agent::_DEBUG_;                // Attiva la modalita' di debug.

int CSPARSIFIER_Agent::virtual_neighbors;
double CSPARSIFIER_Agent::max_delay;
int CSPARSIFIER_Agent::max_timeout_connect;
double CSPARSIFIER_Agent::jitter_timeout_connect;
double CSPARSIFIER_Agent::timeout_connect;
int CSPARSIFIER_Agent::max_timeout_candidate;
double CSPARSIFIER_Agent::jitter_timeout_candidate;
double CSPARSIFIER_Agent::timeout_candidate;

static class CSparsifierClass : public TclClass {
public:
    CSparsifierClass() : TclClass("Agent/CSPARSIFIER") {}
    TclObject* create(int , const char*const* ) {
        return(new CSPARSIFIER_Agent());
    }
} class_c_sparsifier;

static class CSparsifierHeaderClass : public PacketHeaderClass {
public:
	CSparsifierHeaderClass() : PacketHeaderClass("PacketHeader/CSPARSIFIER",
					      sizeof(hdr_c_sparsifier)) {
		bind_offset(&hdr_c_sparsifier::offset_);
	}
} class_c_sparsifierhdr;

//
// Gestisce l'arrivo di un timeout segnalandolo
// opportunamente all'Agente.
//
void
CSparsifierTimer::handle(Event *e)
{
	//
	// Timeout CONNECT.
	//
    for (TimeoutMap::iterator i = connect_timeouts.begin(); i != connect_timeouts.end(); i++) {
        if (i->second.timeout == e) {
            i->second.num--;
            if (i->second.num <= 0) {
                agent->lastTimeout(i->first, TIMEOUT_CONNECT);
            }
            else {
                Scheduler::instance().schedule(this, e, 
                    CSPARSIFIER_Agent::timeout_connect + Random::uniform(CSPARSIFIER_Agent::jitter_timeout_connect));
                agent->timeout(i->first, TIMEOUT_CONNECT);
            }
        }
    }

	//
	// Timeout CANDIDATE.
	//
    for (TimeoutMap::iterator i = candidate_timeouts.begin(); i != candidate_timeouts.end(); i++) {
        if (i->second.timeout == e) {
            i->second.num--;
            if (i->second.num <= 0) {
                agent->lastTimeout(i->first, TIMEOUT_CANDIDATE);
            }
            else {
                Scheduler::instance().schedule(this, e, 
                    CSPARSIFIER_Agent::timeout_connect + Random::uniform(CSPARSIFIER_Agent::jitter_timeout_connect));
                agent->timeout(i->first, TIMEOUT_CANDIDATE);
            }
        }
    }

}

//
// Fa partire i timeout per i nodi che non hanno ancora risposto al
// messaggio di HELLO inviando la propria lista di vicini.
//        
void
CSparsifierTimer::launchConnectTimeouts(NodeList & neighbors)
{
    for (NodeList::iterator i = neighbors.begin(); i != neighbors.end(); i++) {
        // Definisce i Timeout di tipo HELLO
        struct Timeout h;
        h.timeout = new Event();
        h.num = CSPARSIFIER_Agent::max_timeout_connect;
        connect_timeouts[*i] = h;
        Scheduler::instance().schedule(this, h.timeout, 
            CSPARSIFIER_Agent::timeout_connect + Random::uniform(CSPARSIFIER_Agent::jitter_timeout_connect));
    }    
}

//
// L'agente segnala la ricezione di un messaggio di tipo HELLO:
// il timeout viene eliminato.
//
void 
CSparsifierTimer::receivedConnect(NodeAddress from)
{
    TimeoutMap::iterator i;
    for (i = connect_timeouts.begin(); i != connect_timeouts.end(); i++) {
        if (i->first == from) {
            Scheduler::instance().cancel(i->second.timeout);
            break;
        }
    }
    if (i != connect_timeouts.end())
        connect_timeouts.erase(i);
}

//
// Fa partire i timeout per i nodi che non hanno ancora risposto al
// messaggio di HELLO inviando la propria lista di vicini.
//        
void
CSparsifierTimer::launchCandidateTimeouts(NodeList & neighbors)
{
    for (NodeList::iterator i = neighbors.begin(); i != neighbors.end(); i++) {
        // Definisce i Timeout di tipo CANDIDATE
        struct Timeout h;
        h.timeout = new Event();
        h.num = CSPARSIFIER_Agent::max_timeout_candidate;
        candidate_timeouts[*i] = h;
        Scheduler::instance().schedule(this, h.timeout, 
            CSPARSIFIER_Agent::timeout_candidate + Random::uniform(CSPARSIFIER_Agent::jitter_timeout_candidate));
    }    
}

//
// L'agente segnala la ricezione di un messaggio di tipo CONNECT:
// il timeout viene eliminato.
//
void 
CSparsifierTimer::receivedCandidate(NodeAddress from)
{
    TimeoutMap::iterator i;
    for (i = candidate_timeouts.begin(); i != candidate_timeouts.end(); i++) {
        if (i->first == from) {
            Scheduler::instance().cancel(i->second.timeout);
            break;
        }
    }
    if (i != candidate_timeouts.end())
        candidate_timeouts.erase(i);
}

//
// Costruttore
//
CSPARSIFIER_Agent::CSPARSIFIER_Agent() : ClusteringModule(PT_CSPARSIFIER)
{
    timer = new CSparsifierTimer(this);
	
	bind_bool("debug", &_DEBUG_);

	bind("virtual-neighbors", &virtual_neighbors);
	bind("max-delay", &max_delay);

	bind("max-timeout-connect", &max_timeout_connect);
	bind("jitter-timeout-connect", &jitter_timeout_connect);
	bind("timeout-connect", &timeout_connect);
	
	bind("max-timeout-candidate", &max_timeout_candidate);
	bind("jitter-timeout-candidate", &jitter_timeout_candidate);
	bind("timeout-candidate", &timeout_candidate);
	
}

void 
CSPARSIFIER_Agent::receive(Packet *p, Handler *h) 
{
    struct hdr_c_sparsifier *csparsifierh = HDR_CSPARSIFIER(p);    

    // Mittente.
    NodeAddress sender_address = csparsifierh->sender_address;
    // Destinazione.
    NodeAddress destination_address = csparsifierh->destination_address;
		
    switch (csparsifierh->msg_type) {
        case CSPARSIFIER_CANDIDATE :
		
			if (status != CSPARISFIER_STATUS_CANDIDATE)
				return;

			if (_DEBUG_) {
				printf("%d receive CANDIDATE: FROM %d (", myAddress, sender_address);
				for (NodeList::iterator node = (csparsifierh->selectedNodes)->begin(); node != (csparsifierh->selectedNodes)->end(); node++)
					printf("%d  ", *node);
				printf(")\n");
			}
				
			// Memorizza i nodi selezionati dal vicino
			selectedNodes[sender_address] = *(csparsifierh->selectedNodes);

			// Cancella il timeout.
			timer->receivedCandidate(sender_address);

			if (selectedNodes.size() == neighbors.size()) {
				if (_DEBUG_)
					printf("%d receive ALL CANDIDATE\n", myAddress);
			
				status = CSPARISFIER_STATUS_CONNECT;
				
				// Crea la lista dei vicini finali aggiungendo a quelli candidati,
				// i nodi vicini che hanno richiesto la connessione col nodo corrente.
				sparseNeighbors = candidateNeighbors;
				for (map<NodeAddress, NodeList>::iterator it = selectedNodes.begin(); it != selectedNodes.end(); it++) {
					if (find((it->second).begin(), (it->second).end(), myAddress) != (it->second).end())
						sparseNeighbors.insert(it->first);
				}

				// Invia il messaggio di connessione a tutti i nodi a cui non l'ha gia'mandato.
				for (NodeList::iterator it = sparseNeighbors.begin(); it != sparseNeighbors.end(); it++) {
					if (find(connect_nodes.begin(), connect_nodes.end(), *it) == connect_nodes.end())
						send_CONNECT(*it);
				}
					
				timer->launchConnectTimeouts(sparseNeighbors);
				
				// Elimina dai timeout i nodi che hanno gia'inviato il messaggio di connessione.
				for (NodeList::iterator it = connect_nodes.begin(); it != connect_nodes.end(); it++)
					timer->receivedConnect(*it);
					
				if (connect_nodes.size() == sparseNeighbors.size())
					endModule();
				
			}
			
            break;
			
		case CSPARSIFIER_CONNECT :

			if (_DEBUG_)
				printf("%d receive CONNECT: FROM %d\n", myAddress, sender_address);
		
			// Aggiunge il nodo alla lista di quelli che sono connessi
			connect_nodes.insert(sender_address);

			// Risponde al messaggio di connessione.
			if (status == CSPARISFIER_STATUS_CANDIDATE)
				send_CONNECT(sender_address);
			else {
				timer->receivedConnect(sender_address);
				if (connect_nodes.size() == sparseNeighbors.size())
					endModule();
			}
				
			break;
			
		case CSPARSIFIER_REQUEST :

			if (_DEBUG_)
				printf("%d receive REQUEST: FROM %d ", myAddress, sender_address);
		
			switch (csparsifierh->request) {
			
				case CSPARISFIER_STATUS_CANDIDATE : 

					if (_DEBUG_)
						printf("[CANDIDATE]\n");

					send_CANDIDATE(sender_address);
					break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区激情小说| 国产成人精品免费一区二区| 日本麻豆一区二区三区视频| 国产.欧美.日韩| 日韩欧美一级二级三级久久久| 亚洲色图清纯唯美| 国产精品自拍一区| 日韩一区二区影院| 夜夜嗨av一区二区三区中文字幕 | 夜夜爽夜夜爽精品视频| 久久99精品一区二区三区| 在线日韩一区二区| 中文字幕日本乱码精品影院| 日韩激情一二三区| 欧美四级电影网| 亚洲精品成a人| a在线欧美一区| 中文字幕第一区第二区| 久久成人麻豆午夜电影| 欧美精品自拍偷拍| 一区二区三区久久| 91蜜桃免费观看视频| 国产精品你懂的在线欣赏| 经典一区二区三区| 日韩一二三区视频| 蜜桃视频一区二区三区在线观看| 欧美性生活久久| 亚洲综合清纯丝袜自拍| 一本久久综合亚洲鲁鲁五月天| 国产午夜精品在线观看| 国产高清不卡一区| 国产欧美综合在线观看第十页| 国产麻豆91精品| 国产女人18毛片水真多成人如厕 | 国产一区二区三区久久久| 91精品国产麻豆| 肉肉av福利一精品导航| 欧美精品成人一区二区三区四区| 亚洲午夜免费视频| 欧美老年两性高潮| 日韩成人精品在线观看| 日韩美女一区二区三区四区| 捆绑调教美女网站视频一区| 久久综合狠狠综合久久综合88| 国模一区二区三区白浆| 国产亚洲精品中文字幕| 97久久超碰精品国产| 中文字幕字幕中文在线中不卡视频| 波多野结衣在线aⅴ中文字幕不卡| 国产欧美日韩在线| 99久久精品一区二区| 亚洲欧美乱综合| 欧美剧在线免费观看网站| 男女性色大片免费观看一区二区| 日韩欧美国产综合一区 | 欧美国产精品久久| 91精彩视频在线| 麻豆精品视频在线| 国产精品欧美极品| 欧美亚洲愉拍一区二区| 久久97超碰国产精品超碰| 国产精品丝袜91| 欧美精品一二三四| 国产精品综合一区二区三区| 一区二区三区日韩在线观看| 日韩欧美一级精品久久| 不卡一卡二卡三乱码免费网站| 亚洲国产日韩精品| 国产午夜精品久久久久久久| 在线日韩av片| 国产一区二区不卡| 亚洲成年人影院| 日本一区二区高清| 日韩一区二区三区免费看| 国产成人无遮挡在线视频| 亚洲午夜激情av| 国产女主播视频一区二区| 7777精品伊人久久久大香线蕉完整版| 国产制服丝袜一区| 亚洲二区在线视频| 中文字幕在线一区二区三区| 91国内精品野花午夜精品| 久久久精品欧美丰满| 紧缚奴在线一区二区三区| 一区在线播放视频| 欧美精品第一页| 色综合欧美在线| 国产99久久久精品| 日本女人一区二区三区| 亚洲欧美色一区| 日本一区二区免费在线观看视频| 6080亚洲精品一区二区| 91婷婷韩国欧美一区二区| 国产盗摄一区二区| 久久99精品国产麻豆婷婷| 亚洲自拍偷拍九九九| 国产精品动漫网站| 国产三级一区二区| 欧美岛国在线观看| 制服丝袜中文字幕亚洲| 欧美日韩一区二区不卡| 91蝌蚪porny九色| 丁香六月综合激情| 国产一区二区导航在线播放| 毛片av一区二区三区| 午夜精品久久久久久不卡8050| 亚洲精品免费视频| 亚洲欧美一区二区久久 | 91美女在线看| 成人免费av网站| 不卡一区二区在线| 99在线精品视频| 一本久久a久久精品亚洲| 91网站在线播放| 日本高清不卡在线观看| 欧美一a一片一级一片| 欧美在线观看你懂的| 精品污污网站免费看| 欧美日韩免费一区二区三区视频| 欧美日韩一区视频| 欧美一区二区不卡视频| 日韩视频免费观看高清完整版 | 国产一区二区三区黄视频 | av在线不卡电影| 色网综合在线观看| 欧美日韩中文字幕一区| 51久久夜色精品国产麻豆| 日韩午夜在线播放| 国产清纯在线一区二区www| 国产精品国产三级国产aⅴ无密码| 国产精品国产成人国产三级| 亚洲另类色综合网站| 一区二区在线观看av| 亚洲国产成人av好男人在线观看| 午夜天堂影视香蕉久久| 免费欧美高清视频| 国产传媒日韩欧美成人| 99免费精品视频| 欧美群妇大交群中文字幕| 日韩精品一区二区三区老鸭窝| 久久久高清一区二区三区| 亚洲图片另类小说| 日本成人在线不卡视频| 国产成人精品三级麻豆| 在线观看日韩一区| 精品久久国产97色综合| 国产精品初高中害羞小美女文| 亚洲精品国产高清久久伦理二区| 日韩av网站免费在线| 国产成人在线观看| 欧美视频在线播放| 国产日韩欧美不卡| 视频一区二区中文字幕| 精品无人区卡一卡二卡三乱码免费卡| 国产大片一区二区| 在线成人免费观看| 亚洲欧洲性图库| 久久国产尿小便嘘嘘尿| caoporn国产精品| 欧美一区二区三区爱爱| 亚洲欧美色一区| 国产一区二区免费视频| 欧美性受xxxx黑人xyx性爽| www久久精品| 日本大胆欧美人术艺术动态| www.日韩av| 久久精品日产第一区二区三区高清版| 亚洲一区在线观看免费观看电影高清| 麻豆成人av在线| 欧美三级日韩三级| 国产精品麻豆欧美日韩ww| 久久成人久久爱| 欧美日韩高清在线播放| 国产精品对白交换视频 | 色狠狠色狠狠综合| 久久久久久夜精品精品免费| 丝袜亚洲另类丝袜在线| 972aa.com艺术欧美| 337p日本欧洲亚洲大胆色噜噜| 亚洲五月六月丁香激情| 一本久道中文字幕精品亚洲嫩| 欧美激情中文不卡| 国产不卡视频在线观看| 日韩女优电影在线观看| 日韩黄色一级片| 欧美精品日韩一区| 亚洲国产人成综合网站| 99re这里只有精品首页| 日韩一区在线播放| av在线免费不卡| 日韩毛片在线免费观看| 成人深夜在线观看| 国产精品家庭影院| 成人激情开心网| 国产精品初高中害羞小美女文 | 国产一区二区主播在线| 日韩欧美美女一区二区三区| 日本亚洲天堂网| 欧美一级高清片| 国产中文字幕精品|