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

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

?? kelips.c

?? 該協議是經典的結構化p2p協議之一
?? C
?? 第 1 頁 / 共 2 頁
字號:
// ip: someone random we know about.// ip1: random contact of ip in the target group.// ip2: who ip1 thinks has the key.boolKelips::lookup2(lookup_args *a) {  vector<IPAddress> l = all();  if(l.size() < 1)    return false;  IPAddress ip = l[random() % l.size()];  IPAddress ip1 = 0;  bool ok = xRPC(ip, 2, &Kelips::handle_lookup2, &(a->key), &ip1, STAT_LOOKUP, &(a->total_to),&(a->num_to));  a->history.push_back(ip);  if(!ok || ip1 == 0 || (now()-a->start >= _max_lookup_time))    return false;  IPAddress ip2 = 0;  ok = xRPC(ip1, 2, &Kelips::handle_lookup1, &(a->key), &ip2, STAT_LOOKUP, &(a->total_to),&(a->num_to));  a->history.push_back(ip1);  if(!ok || ip2 == 0 || (now()-a->start>=_max_lookup_time))    return false;  bool done = false;  ok = xRPC(ip2, 2, &Kelips::handle_lookup_final, &(a->key), &done, STAT_LOOKUP, &(a->total_to),&(a->num_to));  a->history.push_back(ip2);  return(ok && done &&(now()-a->start<_max_lookup_time));}// Someone in our group wants us to return them a// random contact in the key's group.voidKelips::handle_lookup2(ID *kp, IPAddress *res){  if((*res = find_by_id(*kp)) != 0)    return;  vector<IPAddress> cl = grouplist(id2group(*kp));  if(cl.size() > 0)    *res = cl[random() % cl.size()];  else    *res = 0;#if 0  printf("%qd %d handle_lookup2(%qd) %d\n",         now(), ip(), *kp, *res);#endif}// Do we have the given node/key ID in our local state?IPAddressKelips::find_by_id(ID key){  vector<IPAddress> l = all();  for(u_int i = 0; i < l.size(); i++)    if(ip2id(l[i]) == key)      return l[i];  return 0;}// Someone outside the group is asking us which node is// responsible for the given key.voidKelips::handle_lookup1(ID *kp, IPAddress *res){  ID key = *kp;  assert(id2group(key) == group());  if(id() == key){    *res = ip();    return;  }  *res = find_by_id(key);#if 0  if(*res == 0)    printf("%qd %d handle_lookup1(%qd) failed\n", now(), ip(), key);#endif}voidKelips::handle_lookup_final(ID *kp, bool *done){  if(*kp == id()){    *done = true;  } else {    *done = false;  }#if 0  printf("%qd %d handle_lookup_final(%qd) %s\n",         now(), ip(), *kp, *done == true ? "ok" : "OOPS");#endif}voidKelips::insert(Args *a){}// A new node is asking us to tell it about some random// existing nodes. This is basically "pull" gossip.// Only the well-known-node should receive this RPC.// It remembers the caller to help seed its _info.voidKelips::handle_join(IPAddress *caller, vector<Info> *ret){  gotinfo(Info(*caller, now()), -1); // XXX caller should supply an Info  // send a super-big ration on join, per Indranil's e-mail.  *ret = gossip_msg(ip2group(*caller), 20, 20);}// This node has just learned about another node.// Remember the information, prepare to gossip it.// Enforce the invariant that we have at most 2 contacts// for each foreign group.// If rtt != -1, it's newly measured.voidKelips::gotinfo(Info i, int rtt){  if(i._ip == ip())    return;  assert(i._ip);  if(_info.find(i._ip) == _info.end()){    int g = ip2group(i._ip);    bool add = false;    if(g == group()){      add = true;    } else {      IPAddress x = victim(g); // pick the lamest contact to replace.      assert(x == 0 || ip2group(x) == g);      if(x == 0){        add = true;      } else if(i.age() < 4 * _info[x]->age()){        Info *in = _info[x];        assert(in);        _info.erase(x);        delete in;        add = true;      }    }    if(add){      _info[i._ip] = New Info(i);      _info[i._ip]->_rounds = _item_rounds;      _info[i._ip]->_rtt = -1;    }  } else if (i._heartbeat > _info[i._ip]->_heartbeat){    _info[i._ip]->_heartbeat = i._heartbeat;    if(_info[i._ip]->_rtt == 9999){      // we once got an RPC timeout, but node seems to have restarted.      _info[i._ip]->_rtt = -1;    }  }  if(rtt != -1 && _info.find(i._ip) != _info.end())    _info[i._ip]->_rtt = rtt;}// Return a list of all the IP addresses in _info.vector<IPAddress>Kelips::all(){  vector<IPAddress> l;  for(map<IPAddress, Info *>::const_iterator ii = _info.begin();      ii != _info.end();      ++ii){    l.push_back(ii->first);  }  return l;}// Return the list of the IP addresses in _info in our group.vector<IPAddress>Kelips::grouplist(int g){  vector<IPAddress> l;  for(map<IPAddress, Info *>::const_iterator ii = _info.begin();      ii != _info.end();      ++ii){    if(ip2group(ii->second->_ip) == g)      l.push_back(ii->first);  }  return l;}// Return the list of the IP addresses *not* in our group.vector<IPAddress>Kelips::notgrouplist(int g){  vector<IPAddress> l;  for(map<IPAddress, Info *>::const_iterator ii = _info.begin();      ii != _info.end();      ++ii){    if(ip2group(ii->second->_ip) != g)      l.push_back(ii->first);  }  return l;}// Given a list of nodes, limit it to ones that are new (or old).// "new" means _rounds > 0.vector<IPAddress>Kelips::newold(vector<IPAddress> a, bool xnew){  vector<IPAddress> b;  for(u_int i = 0; i < a.size(); i++)    if((_info[a[i]]->_rounds > 0) == xnew)      b.push_back(a[i]);  return b;}// Randomize the order of a list of nodes.vector<IPAddress>Kelips::randomize(vector<IPAddress> a){  if(a.size() < 1)    return a;  for(u_int i = 0; i < a.size(); i++){    int j = random() % a.size();    IPAddress tmp = a[i];    a[i] = a[j];    a[j] = tmp;  }  return a;}// Given a list of nodes in l, add a ration of them to msg,// half new and the rest old.voidKelips::newold_msg(vector<Info> &msg, vector<IPAddress> l, u_int ration){  u_int n = 0;  {    // Half the ration for newly learned nodes.    vector<IPAddress> nl = randomize(newold(l, true));    for(u_int i = 0; n <= ration / 2 && i < nl.size(); i++, n++){      Info *ip = _info[nl[i]];      assert(ip->_rounds > 0);      ip->_rounds -= 1;      msg.push_back(*ip);    }  }  {    // The remainder of the ration for existing nodes.    vector<IPAddress> ol = randomize(newold(l, false));    for(u_int i = 0; n < ration && i < ol.size(); i++, n++){      Info *ip = _info[ol[i]];      assert(ip->_rounds == 0);      msg.push_back(*ip);    }  }}// Create a gossip message.// Always include an entry for ourselves.// g allows targeted "pull" gossip during join, critical// to avoid disconnection!// XXX ought to send newer heartbeats preferentially????vector<Kelips::Info>Kelips::gossip_msg(int g, u_int gr, u_int cr){  vector<Info> msg;  // Include this node w/ new heartbeat in every gossip.  msg.push_back(Info(ip(), now()));  // Add some nodes from our group.  newold_msg(msg, grouplist(g), gr);  // Add some contact nodes.  newold_msg(msg, notgrouplist(g), cr);  assert(msg.size() <= 1 + gr + cr);  return msg;}voidKelips::handle_ping(void *xx, void *yy){}// One round of gossiping.// Pick a few items to send, and send them to a few other nodes.// XXX ought to send to nearby nodes preferentially (Section 2.1).voidKelips::gossip(void *junk){  if(_live){    vector<Info> msg = gossip_msg(group(), _group_ration, _contact_ration);    {      vector<IPAddress> gl = randomize(grouplist(group()));      for(u_int i = 0; i < _group_targets && i < gl.size(); i++){	//since each gossip contains the heartbeat timer for a node, add extra 4 byte        xRPC(gl[i], 2 * msg.size(), &Kelips::handle_gossip, &msg, (void *) 0);      }    }    {      vector<IPAddress> cl = randomize(notgrouplist(group()));      for(u_int i = 0; i < _contact_targets && i < cl.size(); i++){        xRPC(cl[i], 2 * msg.size(), &Kelips::handle_gossip, &msg, (void *) 0);      }    }    // ping one random node to find its RTT.    {      vector<IPAddress> l = all();      for(int iters = 0; l.size() > 0 && iters < 10; iters++){        IPAddress xip = l[random() % l.size()];        if(_info[xip]->_rtt == -1){          xRPC(xip, 2, &Kelips::handle_ping, (void*)0, (void*)0);          break;        }      }    }  }  delaycb(random() % (2 *_round_interval), &Kelips::gossip, (void *) 0);}voidKelips::handle_gossip(vector<Info> *msg, void *ret){  u_int i;  for(i = 0; i < msg->size(); i++){    gotinfo((*msg)[i], -1);  }}// Periodically get rid of _info entries that have// expired heartbeats.voidKelips::purge(void *junk){  vector<IPAddress> l = all();  for(u_int i = 0; i < l.size(); i++){    Info *in = _info[l[i]];    int to =      (ip2group(in->_ip) == group() ? _timeout : 2*_timeout);    if(in->_heartbeat + to < now()){#if 0      printf("%qd %d timed out %d %s\n",             now(), ip(), in->_ip,             node_key_alive(ip2id(in->_ip)) ? "oops" : "ok");#endif      _info.erase(l[i]);      delete in;    }  }  delaycb(_purge_time, &Kelips::purge, (void *) 0);}// Called by KelipsObserver::init_state() with the complete list// of nodes to help us initialize our routing tables faster (i.e. cheat).// So in most nodes it's called before join().voidKelips::init_state(const set<Node*> *lid){  for(set<Node*>::const_iterator i = lid->begin(); i != lid->end(); ++i) {    Kelips *k = dynamic_cast<Kelips*>(*i);    assert(k);    if(k->ip() == ip())      continue;    Time rtt = 2 * Network::Instance()->gettopology()->latency(ip(), k->ip());    gotinfo(Info(k->ip(), now()), rtt);  }}// KelipsObserver wants to know if we've stabilized.// lid is a list of all live nodes.boolKelips::stabilized(vector<ID> lid){  // Do we know about all nodes in our own group?  for(u_int i = 0; i < lid.size(); i++)    if(id2group(lid[i]) == group() && find_by_id(lid[i]))      return false;  // Do we know of two contacts from each other group?  int *cc = (int *) malloc(_k * sizeof(int));  memset(cc, '\0', _k * sizeof(int));  for(u_int i = 0; i < lid.size(); i++)    if(find_by_id(lid[i]))      cc[id2group(lid[i])] += 1;  for(int i = 0; i < _k; i++){    if(cc[i] < _n_contacts){      delete cc;      return false;    }  }  delete cc;  return true;}// Kelips just did an RPC. The request contained nsent IDs,// the reply contained nrecv IDs. Update the RPC statistics.// Jinyang/Jeremy convention://   20 bytes header, 4 bytes/ID, 1 byte/other// (Kelips paper says 40 bytes per gossip entry...)voidKelips::rpcstat(bool ok, IPAddress dst, int latency, int nitems, uint type){  if (Node::collect_stat()) {    _rpc_bytes += 20 + nitems * 4; // paper says 40 bytes per node entry    record_bw_stat( type, nitems, 0 );    if(ok) {      _rpc_bytes += 20;      record_bw_stat( type, 0, 0 );    }  }  if(ok)    gotinfo(Info(dst, now()), latency);  if(ok == false && _info.find(dst) != _info.end()){    _info[dst]->_rtt = 9999;  }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品久久久久久久91蜜桃 | 国产日韩欧美高清在线| 亚洲不卡一区二区三区| 欧美在线播放高清精品| 亚洲综合色婷婷| 欧美高清视频不卡网| 日本亚洲最大的色成网站www| 欧美日韩三级在线| 老司机免费视频一区二区| 日韩一级精品视频在线观看| 国产真实乱子伦精品视频| 久久久国产精品麻豆| 国产99久久久精品| 亚洲激情网站免费观看| 欧美伦理影视网| 国产做a爰片久久毛片| 国产精品人人做人人爽人人添| 99精品视频在线免费观看| 亚洲sss视频在线视频| 日韩欧美在线综合网| 国产盗摄精品一区二区三区在线| 夜夜操天天操亚洲| 欧美va亚洲va| 色伊人久久综合中文字幕| 日韩电影免费在线观看网站| 久久久99久久| 欧美日韩在线一区二区| 极品美女销魂一区二区三区免费| 国产精品不卡视频| 91精品麻豆日日躁夜夜躁| 99久久99久久精品免费看蜜桃| 秋霞电影一区二区| 亚洲婷婷国产精品电影人久久| 欧美视频在线不卡| 成人爽a毛片一区二区免费| 亚洲午夜在线视频| 久久久久国产精品麻豆ai换脸| 在线区一区二视频| 国产精品1区2区3区在线观看| 亚洲宅男天堂在线观看无病毒| 精品理论电影在线观看| 日本电影亚洲天堂一区| 国产一区二区久久| 亚洲一区二区三区四区五区黄| 国产欧美一区二区三区在线看蜜臀| 色久综合一二码| 99久久久久久| 国产一区二区三区不卡在线观看| 亚洲成av人片一区二区梦乃| 国产精品久久影院| 久久综合久久综合久久综合| 欧美精品日韩精品| 一本一道久久a久久精品| 国产黄色精品视频| 精品亚洲成av人在线观看| 亚洲成av人片| 亚洲国产精品一区二区www| ●精品国产综合乱码久久久久| 久久先锋影音av鲁色资源网| 欧美一区二区免费观在线| 欧洲一区二区三区在线| 91久久线看在观草草青青| 成人免费视频app| 国产专区综合网| 久久电影网站中文字幕| 日韩电影在线一区二区三区| 亚洲第四色夜色| 亚洲一区二区成人在线观看| 中文字幕精品一区二区三区精品| 欧美精品一区二| 精品国产乱码久久久久久夜甘婷婷| 欧美男人的天堂一二区| 欧美视频中文字幕| 91久久奴性调教| 欧洲一区在线观看| 欧美日韩在线综合| 欧美视频三区在线播放| 在线观看三级视频欧美| 欧洲色大大久久| 欧美丝袜丝交足nylons图片| 在线观看免费亚洲| 欧美日韩和欧美的一区二区| 欧美亚洲一区三区| 3atv一区二区三区| 日韩欧美激情四射| 久久久精品综合| 欧美韩国一区二区| 中文一区二区完整视频在线观看| 国产亚洲欧美色| 一区在线观看视频| 亚洲三级视频在线观看| 亚洲综合999| 日韩av电影免费观看高清完整版在线观看 | 国产高清在线观看免费不卡| 成人一级视频在线观看| 99久久精品免费看| 欧美午夜在线一二页| 欧美日韩精品欧美日韩精品| 日韩免费高清av| 久久久亚洲精品一区二区三区| 国产精品欧美久久久久无广告 | 午夜欧美大尺度福利影院在线看| 亚洲国产精品久久久久秋霞影院| 香蕉久久一区二区不卡无毒影院 | 一区二区高清免费观看影视大全| 亚洲一区免费在线观看| 免费观看日韩电影| 成人性视频网站| 在线观看日韩电影| 久久综合精品国产一区二区三区| 国产精品欧美一区喷水| 亚洲一二三级电影| 国产九九视频一区二区三区| 91在线视频免费观看| 日韩一二在线观看| 国产精品二三区| 久久草av在线| 色综合中文字幕国产| 宅男在线国产精品| 中文字幕av一区二区三区免费看| 亚洲国产精品久久不卡毛片| 国产成人精品免费在线| 欧美日韩精品是欧美日韩精品| 久久久噜噜噜久久人人看| 一区二区三区小说| 国产精品综合久久| 欧美三级视频在线播放| 国产欧美精品一区二区色综合| 亚洲福利视频一区| 成人免费va视频| 精品欧美一区二区在线观看| 一区二区三区四区视频精品免费 | 午夜精品久久久| 成人av在线资源| 欧美日本韩国一区二区三区视频 | 国产女人18毛片水真多成人如厕 | 久久精品理论片| 91国产视频在线观看| 久久婷婷成人综合色| 偷窥国产亚洲免费视频| 91亚洲国产成人精品一区二区三 | 最新欧美精品一区二区三区| 另类人妖一区二区av| 在线播放中文一区| 一区二区三区日韩欧美精品 | 亚洲永久精品国产| av不卡免费电影| 久久精品人人爽人人爽| 久久国产麻豆精品| 4438x成人网最大色成网站| 亚洲大型综合色站| 欧美曰成人黄网| 亚洲美女视频在线| 91原创在线视频| 国产精品热久久久久夜色精品三区 | 成人精品国产免费网站| 久久久天堂av| 国产一区二区三区四区五区美女| 91麻豆精品91久久久久同性| 亚洲午夜三级在线| 欧洲精品在线观看| 一区二区三区欧美在线观看| 99久久99久久精品免费看蜜桃| 国产精品无遮挡| www.亚洲精品| 亚洲私人黄色宅男| 91蝌蚪porny九色| 依依成人综合视频| 欧美综合欧美视频| 亚洲国产视频网站| 欧美人伦禁忌dvd放荡欲情| 亚洲高清视频的网址| 欧美日韩国产精品自在自线| 午夜欧美视频在线观看| 日韩一区二区在线看| 久久精品二区亚洲w码| 久久亚洲一区二区三区明星换脸| 久久av资源站| 日本一区二区电影| aaa亚洲精品一二三区| 亚洲三级电影网站| 精品视频在线免费看| 美女精品一区二区| 国产亚洲午夜高清国产拍精品| 成人性视频免费网站| 一区二区三区**美女毛片| 欧美日韩不卡在线| 国产一区二区精品久久91| 亚洲国产精品高清| 色综合一个色综合亚洲| 亚洲成人动漫一区| 日韩欧美一级二级三级久久久| 韩国成人福利片在线播放| 中文字幕精品在线不卡| 欧洲色大大久久| 韩国一区二区三区| 亚洲丝袜美腿综合| 欧美一区二区视频在线观看2020| 国模娜娜一区二区三区| 亚洲天天做日日做天天谢日日欢|