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

📄 sim.c

📁 一个linux下的各种组播路由算法编程
💻 C
📖 第 1 页 / 共 3 页
字号:
            break;
      case REMOVENODE:
            tmpx = (xpos - 10.0) / SIDE;
            tmpy = (ypos - 15.0) / SIDE;
            n1 = manager.findNode(tmpx, tmpy);
            if (n1 != NULL) {
               manager.removeNode(n1);
               manager.refresh(painter);
               msgb.message("Renumber the nodes!");
            }
            else msgb.message("Mouse didn't point to a node");
            flag = NOTHING;
            break;
       case MOVENODE:
            tmpx = (xpos - 10.0) / SIDE;
            tmpy = (ypos - 15.0) / SIDE;
            n1 = manager.findNode(tmpx, tmpy);
            if (n1 != NULL) {
               msgb.message("Click on the new position");
               flag = MOVENODE2;
            }
            else {
               msgb.message("Mouse didn't point to a node");
               flag = NOTHING;
            };
            break;
      case ADDLINK: case REMOVELINK: case EDITLINKCAP:
            if (flag == ADDLINK) flag = ADDLINK2;
            else if (flag == REMOVELINK) flag = REMOVELINK2;
            else flag = EDITLINKCAP2;
            tmpx = (xpos - 10.0) / SIDE;
            tmpy = (ypos - 15.0) / SIDE;
            if (flag == EDITLINKCAP) msgb.message("Click on the head node");
            else msgb.message("Click on the second node");
            break;
       case MOVENODE2:
            tmpx2 = (xpos - 10.0) / SIDE;
            tmpy2 = (ypos - 15.0) / SIDE;
            n1 = manager.findNode(tmpx, tmpy);
            n1->nodePtr()->X(tmpx2);
            n1->nodePtr()->Y(tmpy2);
            msgb.message("");
            manager.refresh(painter);
            flag = NOTHING;
            break;
      case ADDLINK2: case REMOVELINK2: case EDITLINKCAP2:
            tmpx2 = (xpos - 10.0) / SIDE;
            tmpy2 = (ypos - 15.0) / SIDE;
            n1 = manager.findNode(tmpx, tmpy);
            n2 = manager.findNode(tmpx2, tmpy2);
            if ((n1 != NULL) && (n2 != NULL)) {
             if (flag == ADDLINK2) {
               status = manager.addLink(n1, n2);
               if (status == 0) msgb.message("A link already exists");
               else msgb.message("");
               flag = NOTHING;
             }
             else if (flag == REMOVELINK2) {
               status = manager.removeLink(n1, n2);
               if (status ==0) msgb.message("No link between these two nodes");
               else msgb.message("");
               flag = NOTHING;
             }
             else {
               tmpAdj = n1->nodePtr()->adjacentNodes();
               while ((tmpAdj != NULL) && (tmpAdj->nodePtr()!=n2->nodePtr())) 
                 tmpAdj = tmpAdj->next();
               if (tmpAdj == NULL) {
                 msgb.message("No link between these two nodes");
                 flag = NOTHING;
               }
               else {
                 char *ss = new char[60];
                 sprintf(ss, "Capacity of link from %d to %d (in Mbps) = ",
                         n1->nodePtr()->name(), n2->nodePtr()->name());
                 msgb.message(ss);
                 char *s = new char[10];
                 sprintf(s, "%.3lf", tmpAdj->linkCapacity() / 1e6);
                 cmdb.message(s, True);
                 flag = EDITLINKCAP3;
               };
             };
             manager.refresh(painter);
            }
            else msgb.message("Mouse didn't point to two nodes");
            break;
       case ADDSOURCE: case REMOVESOURCE: case ADDDESTINATION: 
       case REMOVEDESTINATION: case ROUTER:case REMOVETREE:
            tmpx = (xpos - 10.0) / SIDE;
            tmpy = (ypos - 15.0) / SIDE;
            tmpNode = manager.findNode(tmpx, tmpy);
            if (tmpNode != NULL) {
               msgb.message("Enter group address");
               cmdb.message("", True);
               switch (flag) {
                  case ADDSOURCE: flag = ADDSOURCE2; break;
                  case REMOVESOURCE: flag = REMOVESOURCE2; break;
                  case ADDDESTINATION: flag = ADDDESTINATION2; break;
                  case REMOVEDESTINATION: flag = REMOVEDESTINATION2; break;
                  case ROUTER: flag = ROUTER2; break;
                  case REMOVETREE: flag = REMOVETREE2; break;
               };
            }
            else {
               msgb.message("Mouse didn't point to a node");
               flag = NOTHING;
            };
            break;
       case DISPLAYTREE:
            tmpx = (xpos - 10.0) / SIDE;
            tmpy = (ypos - 15.0) / SIDE;
            tmpNode = manager.findNode(tmpx, tmpy);
            if (tmpNode != NULL) {
                  manager.displayTree(tmpNode->nodePtr()->name());
                  manager.refresh(painter);
                  flag = NOTHING;
            }
            else {
               msgb.message("Mouse didn't point to a node");
               flag = NOTHING;
            };
            break;
  };
};

void refreshCB() {
   //refreshes and updates the drawing area
   manager.refresh(painter);
};

void renumberCB() {
   //renumbers the nodes starting from 0
   cmdb.message("", False);
   msgb.message("");
   manager.renumber();
   manager.refresh(painter);
};

//The next four functions are for changing the parameters for the 
//random network ganerator and the random link generator
void alphaCB() {
   msgb.message("Alpha = ");
   char *s = new char[10];
   sprintf(s, "%f", alpha);
   cmdb.message(s, True);
   flag = Alpha;
};

void betaCB() {
   msgb.message("Beta = ");
   char *s = new char[10];
   sprintf(s, "%f", beta);
   cmdb.message(s, True);
   flag = Beta;
};

void numberCB() {
   msgb.message("# of nodes = ");
   char *s = new char[10];
   sprintf(s, "%d", number);
   cmdb.message(s, True);
   flag = NUMBER;
};

void degreeCB() {
   msgb.message("Expected node degree = ");
   char *s = new char[10];
   sprintf(s, "%f", degree);
   cmdb.message(s, True);
   flag = DEGREE;
};

void defCapCB() {
   msgb.message("Default link capacity (in Mbps) = ");
   char *s = new char[10];
   sprintf(s, "%.3lf", manager.defaultCapacity / 1e6);
   cmdb.message(s, True);
   flag = DEFCAP;
};

void Activate() {

   //handles data entered by the user through the command bar
   char *s = cmdb.getString();

   cmdb.message("", False);
   msgb.message("");
   double tmpd = atof(s);
   int tmpi = atoi(s);
   int status;


   switch (flag) {

      case OPEN: //open file
            manager.deleteGraph();
            status = manager.readFromFile(s);
            manager.refresh(painter);
            flag = NOTHING;
            currentFile = s;
            changeTitle();
            break;
      case SAVE: //save to file
            manager.writeToFile(s);
            currentFile = s;
            changeTitle();
            flag = NOTHING;
            break;
      case Alpha: //change alpha
         if (tmpd > 0) alpha = tmpd;
            flag = NOTHING;
            break;
      case Beta: //change beta
            if (tmpd > 0) beta = tmpd;
            flag = NOTHING;
            break;
      case NUMBER: //change the number of nodes
            if (tmpi > 0) number = tmpi;
            flag = NOTHING;
            break;
      case DEGREE: //change the node degree
            if (tmpd >= 2) degree = tmpd;
            flag = NOTHING;
            break;
      case DEFCAP: //change the default link capacity
            if (tmpd > 0) manager.defaultCapacity = tmpd*1e6;
            flag = NOTHING;
            break;
      case BATCHSIZE: //change the batchsize
            if (tmpd > 0) batchSize = (tmpd / 1000.0);
            flag = NOTHING;
            break;
      case MINNUMBATCHES: //change the minmumnumber of batches
            if (tmpi > 0)  minNumBatches = tmpi;
            flag = NOTHING;
            break;
      case MAXNUMBATCHES: //change the maximum number of batches
            if (tmpi > 0)  maxNumBatches =  tmpi;
            flag = NOTHING;
            break;
      case ADDSOURCE2:
            if (tmpi > 0) {
               i =  tmpi;
               flag = ADDSOURCE3;
               msgb.message("Enter peak rate in Mbps:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case ADDSOURCE3:
            if (tmpd > 0) {
               tmpx = tmpd * 1e6;
               flag = ADDSOURCE4;
               msgb.message("Enter average to peak ratio:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case ADDSOURCE4:
            if ((tmpd > 0) && (tmpd <= 1)) {
               tmpy = tmpd;
               flag = ADDSOURCE5;
               msgb.message("Enter burst size in msec:");
               cmdb.message("", True);
            }
            else flag = NOTHING;   
            break;
      case ADDSOURCE5:
            if (tmpd > 0) {
               tmpz = tmpd * 1e-3;
               manager.addMCSource(tmpNode->nodePtr(), tmpx, tmpy, tmpz, i,
                                                                     model);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case REMOVESOURCE2:
            if (tmpi > 0)  {
               manager.removeMCSource(tmpNode->nodePtr(), tmpi);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case RANDOMGROUP:
            if (tmpi > 0)  {
               i = tmpi;
               flag = RANDOMGROUP2;
               msgb.message("Enter # of members:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case RANDOMGROUP2:
            if ((tmpi > 0) && (tmpi <= manager.count()))  {
               manager.addRandomMCGroup(tmpi, i);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case REMOVEGROUP:
            if (tmpi > 0)  {
               manager.removeMCGroup(tmpi);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case ADDDESTINATION2:
            if (tmpi > 0) {
               manager.addMCDestination(tmpNode->nodePtr(), tmpi);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case REMOVEDESTINATION2:
            if (tmpi > 0) {
               manager.removeMCDestination(tmpNode->nodePtr(),tmpi);
               manager.refresh(painter);
            };
            flag = NOTHING;
            break;
       case BACKGROUND1:
            if (tmpd >= 0) {
               tmpx = tmpd * 1e6;
               flag = BACKGROUND2;
               msgb.message("Enter max. bg. peak rate in Mbps:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case BACKGROUND2:
            if (tmpd >= 0) {
               tmpy = tmpd * 1e6;
               flag = BACKGROUND3;
               msgb.message("Enter min average to peak ratio:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case BACKGROUND3:
            if ((tmpd > 0) && (tmpd <= 1)) {
               tmpx2 = tmpd;
               flag = BACKGROUND4;
               msgb.message("Enter max average to peak ratio:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case BACKGROUND4:
            if ((tmpd > 0) && (tmpd <= 1)) {
               tmpy2 = tmpd;
               flag = BACKGROUND5;
               msgb.message("Enter min burst in msec:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
        case BACKGROUND5:
            if (tmpd > 0) {
               tmpz = tmpd * 1e-3;
               flag = BACKGROUND6;
               msgb.message("Enter max burst in msec:");
               cmdb.message("", True);
            }
            else flag = NOTHING;
            break;
       case BACKGROUND6:
            if ((tmpd > 0) && (tmpx <= tmpy) && (tmpx2 <= tmpy2)
               && (tmpz <= (tmpd * 1e-3))) {
               if (symmetry == False) {
                  if (batch == False)
                    manager.addMuxedBackgroundTrafficSources(tmpx, 
                                  tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
                  else manager.addBatchBackgroundTrafficSources(tmpx, 
                                  tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
               }
               else {
                  if (batch == False)
                    manager.addMuxedSymmetricBackgroundTrafficSources(tmpx, 
                                  tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
                  else manager.addBatchSymmetricBackgroundTrafficSources(tmpx, 
                                  tmpy, tmpx2, tmpy2, tmpz, (tmpd * 1e-3));
               };
            };
            manager.refresh(painter);
            flag = NOTHING;
            break;
       case ROUTER2:
            if (tmpi > 0)  {
               i = tmpi;   //i is the group address
               SourceList *ss = tmpNode->nodePtr()->sourceList();
               int found = 0;
               while ((ss != NULL) && (found == 0)) {
                  if ((ss->source()->type() != Background) &&
                   (ss->source()->address() == i)) found = 1;
                  else ss = ss->next();
               };
               double cost;
               if (found == 1) {
                  double del, h, maxDel, minDel, ndCount;
                  cost = manager.router(alg, tmpNode->nodePtr(), i, 
                                        del, maxDel, minDel, h, ndCount);
                  char *s = new char[60];
                  if (cost < FAILURE)
                    sprintf(s, "Total cost = %.2lf", (cost / 1e6));
                  else if (cost == DBVIOL) 
                    sprintf(s, "Failure: Delay Bound Violated");
                  else if (cost == LINKSAT) 
                    sprintf(s, "Failure: Saturated Links");
                  else if (cost == SATORDB) 
                    sprintf(s, "Failure: Saturated Links or Delay Bound Violated");
                  msgb.message(s);
                  cmdb.message("", False);
                  manager.refresh(painter);
               }
               else {
                  msgb.message("No source for that group at selected node!");
                  cmdb.message("", False);
               };
            };
            flag = NOTHING;
            break;
        case REMOVETREE2:
            if (tmpi > 0)  {
               i = tmpi;   //i is the group address
               SourceList *sss = tmpNode->nodePtr()->sourceList();
               int Found = 0;
               while ((sss != NULL) && (Found == 0)) {
                  if (sss->source()->address() == i) Found = 1;
                  else sss = sss->next();
               };
               if (Found == 1) {
                  manager.removeTree(tmpNode->nodePtr(), i);
                  manager.refresh(painter);
               }
               else {
                  msgb.message("No source for that group at selected node!");
                  cmdb.message("", False);
               };
            };
            flag = NOTHING;
            break;
       case DISPLAYGROUP:
            if (tmpi > 0) {
               i = tmpi;   //i is the group address
               manager.displayGroup(i);

⌨️ 快捷键说明

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