Advertisement
waqar_107

Untitled

Dec 7th, 2018
534
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.21 KB | None | 0 0
  1. /*** from dust i have come, dust i will be ***/
  2.  
  3. #include<bits/stdc++.h>
  4. #include<arpa/inet.h>
  5. #include<sys/socket.h>
  6. #include<unistd.h>
  7.  
  8. #define dbg printf("in\n")
  9. #define nl printf("\n")
  10. #define inf 1000000000
  11.  
  12. using namespace std;
  13.  
  14. struct route
  15. {
  16.     string next_hop;
  17.     int cost;
  18.  
  19.     route() {}
  20.     route(string next_hop, int cost)
  21.     {
  22.         this->next_hop = next_hop;
  23.         this->cost = cost;
  24.     }
  25. };
  26.  
  27. string myIP;
  28. map<string, route> routingTable;
  29. map<string, route> tempTable;
  30. set<string> adj;
  31. map<string, int > neighborCost;
  32.  
  33. int sockfd, bind_flag;
  34. int bytes_received;
  35. socklen_t addrlen;
  36.  
  37. struct sockaddr_in client_address;
  38. struct sockaddr_in senders_address;
  39. struct sockaddr_in serve;
  40.  
  41. void init()
  42. {
  43.     client_address.sin_family = AF_INET;
  44.     client_address.sin_port = htons(4747);
  45.     inet_pton(AF_INET, myIP.c_str(), &client_address.sin_addr);
  46.  
  47.     serve.sin_family = AF_INET;
  48.     serve.sin_port = htons(4747);
  49.  
  50.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  51.     bind_flag = bind(sockfd, (struct sockaddr*) &client_address, sizeof(sockaddr_in));
  52.  
  53.     cout << "\n---------------------------------------\n";
  54.     if(!bind_flag)
  55.         cout << "connected!!!\n";
  56.     else {
  57.         cout << "connection error\n";
  58.         exit(0);
  59.     }
  60.     cout << "---------------------------------------\n\n";
  61. }
  62.  
  63. void showRoutingTable()
  64. {
  65.     printf("destination        next hop        cost\n");
  66.     printf("-----------        --------        ----\n");
  67.  
  68.     auto itr = routingTable.begin();
  69.     while(itr != routingTable.end())
  70.     {
  71.         cout << itr->first <<"        "<< itr->second.next_hop << "        " << itr->second.cost << endl;
  72.         itr++;
  73.     }
  74. }
  75.  
  76. string toString(int n)
  77. {
  78.     string str = "";
  79.  
  80.     if(!n) return "0";
  81.  
  82.     while(n)
  83.     {
  84.         str.push_back(n % 10 + '0');
  85.         n /= 10;
  86.     }
  87.  
  88.     reverse(str.begin(), str.end());
  89.     return str;
  90. }
  91.  
  92. int toInt(string s)
  93. {
  94.     int n = 0, k = 1;
  95.     for(int i = s.length() - 1 ; i >= 0; i--)
  96.         n += (s[i] - 48) * k, k *= 10;
  97.  
  98.     return n;
  99. }
  100.  
  101. //------------------------------------------------------------------------
  102. //send table
  103. void sendTable()
  104. {
  105.     char buffer2[1024];
  106.     string str = "";
  107.  
  108.     auto itr = routingTable.begin();
  109.     while(itr != routingTable.end())
  110.     {
  111.         if(itr->second.next_hop != "     -     ")
  112.            str += myIP + "|" + itr->first + "|" + itr->second.next_hop + "|" + toString(itr->second.cost) + "_";
  113.  
  114.         itr++;
  115.     }
  116.  
  117.     strcpy(buffer2, str.c_str());
  118.     //printf("sending %s\n", buffer2);
  119.     for(string s : adj)
  120.     {
  121.         serve.sin_addr.s_addr = inet_addr(s.c_str());
  122.         sendto(sockfd, buffer2, 1024, 0, (struct sockaddr*) &serve, sizeof(sockaddr_in));
  123.     }
  124. }
  125. //------------------------------------------------------------------------
  126.  
  127. int main(int argc, char *argv[])
  128. {
  129.     int i, j, k;
  130.     int w;
  131.  
  132.  
  133.     string u, v, line;
  134.     vector<int> vec;
  135.  
  136.  
  137.     char *in = argv[1];
  138.     for(i = 0; i< strlen(in); i++)
  139.         myIP.push_back(in[i]);
  140.  
  141.     //--------------------------------------------------------------------
  142.     //read the file and update the routing table
  143.     ifstream infile(argv[2]);
  144.     while(infile >> u >> v >> w)
  145.     {
  146.         //cout<<u.length()<<" "<<v.length()<<" "<<w<<" "<<myIP.length()<<endl;
  147.         if(u == myIP)
  148.             routingTable[v] = route(v, w), adj.insert(v), neighborCost[v] = w;
  149.  
  150.         else if(v == myIP)
  151.             routingTable[u] = route(u, w), adj.insert(u), neighborCost[u] = w;
  152.  
  153.         else
  154.         {
  155.             if(adj.find(u) != adj.end()) {}
  156.             else
  157.                 routingTable[u] = route("     -     ", inf);
  158.  
  159.             if(adj.find(v) != adj.end()) {}
  160.             else
  161.                 routingTable[v] = route("     -     ", inf);
  162.         }
  163.     }
  164.  
  165.     //initial routing table
  166.     showRoutingTable();
  167.     //--------------------------------------------------------------------
  168.  
  169.  
  170.     //--------------------------------------------------------------------
  171.     //initialize receive mode
  172.     init();
  173.  
  174.     while(true)
  175.     {
  176.         char buffer[1024];
  177.         bytes_received = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*) &senders_address, &addrlen);
  178.  
  179.         //printf("[%s:%d]: %s\n", inet_ntoa(senders_address.sin_addr), ntohs(senders_address.sin_port), buffer);
  180.         if(bytes_received != -1)
  181.         {
  182.             string cmd(buffer);
  183.             //cout<<cmd<<endl;
  184.  
  185.             //show the routing table
  186.             if(cmd.find("show") != string::npos)
  187.                 showRoutingTable();
  188.  
  189.             //exchange routing table
  190.             else if(cmd.find("clk") != string::npos)
  191.             {
  192.                 //cout << cmd << endl;
  193.                 sendTable();
  194.             }
  195.  
  196.             else if(cmd.find("cost") != string::npos)
  197.             {
  198.                 vec.clear();
  199.                 for(i = 4; i < bytes_received; i++)
  200.                 {
  201.                     k = buffer[i];
  202.                     if(k < 0)
  203.                         k += 256;
  204.  
  205.                     vec.push_back(k);
  206.                 }
  207.  
  208.                 u = toString(vec[0]) + "." + toString(vec[1]) + "." + toString(vec[2]) + "." + toString(vec[3]);
  209.                 v = toString(vec[4]) + "." + toString(vec[5]) + "." + toString(vec[6]) + "." + toString(vec[7]);
  210.                 w = vec[8];
  211.  
  212.                 if(u == myIP)
  213.                     neighborCost[v] = w;
  214.                 else
  215.                     neighborCost[u] = w;
  216.  
  217.                 //check if you would go to the neighbours directly
  218.                 //updates after cost change
  219.                 auto itr = neighborCost.begin();
  220.                 while(itr != neighborCost.end())
  221.                 {
  222.                     if(routingTable[itr->first].cost > itr->second)
  223.                         routingTable[itr->first].next_hop = itr->first, routingTable[itr->first].cost = itr->second;
  224.                     itr++;
  225.                 }
  226.             }
  227.  
  228.             else if(cmd.find("send") != string::npos)
  229.             {
  230.                 vec.clear();
  231.                 for(i = 4; i < bytes_received; i++)
  232.                 {
  233.                     k = buffer[i];
  234.                     if(k < 0)
  235.                         k += 256;
  236.  
  237.                     vec.push_back(k);
  238.                 }
  239.  
  240.                 u = toString(vec[0]) + "." + toString(vec[1]) + "." + toString(vec[2]) + "." + toString(vec[3]);
  241.                 v = toString(vec[4]) + "." + toString(vec[5]) + "." + toString(vec[6]) + "." + toString(vec[7]);
  242.                 k = vec[8];
  243.  
  244.                 //cout<<"u: "<<u<<". v: "<<v<<" mip: "<<myIP<<endl;
  245.  
  246.                 //destination reached
  247.                 string temp = "";
  248.                 if(v == myIP)
  249.                 {
  250.                     for(i = 9; i <= k + 9; i++)
  251.                         temp.push_back((char)vec[i]);
  252.  
  253.                     cout << u << " sent packet: " << temp <<endl;
  254.                 }
  255.  
  256.  
  257.                 else
  258.                 {
  259.                     //cout<<"u: "<<u<<". v: "<<v<<". msg: "<<temp<<endl;
  260.                     if(routingTable[v].next_hop != "     -     ")
  261.                     {
  262.                         cout << "packet forwarded to router-" << routingTable[v].next_hop << endl;
  263.                         serve.sin_addr.s_addr = inet_addr(routingTable[v].next_hop.c_str());
  264.                         sendto(sockfd, buffer, 1024, 0, (struct sockaddr*) &serve, sizeof(sockaddr_in));
  265.                     }
  266.  
  267.                     else
  268.                         cout << "router " << v << " seems uncreachable at the moment\n";
  269.                 }
  270.  
  271.                 memset(buffer, 0, sizeof(buffer));
  272.             }
  273.  
  274.             else
  275.             {
  276.  
  277.                 //check if you would go to the neighbours directly
  278.                 auto itr = neighborCost.begin();
  279.                 while(itr != neighborCost.end())
  280.                 {
  281.                     if(routingTable[itr->first].cost > itr->second)
  282.                         routingTable[itr->first].next_hop = itr->first, routingTable[itr->first].cost = itr->second;
  283.                     itr++;
  284.                 }
  285.  
  286.                 //the r'outing table is here, so try to update
  287.                 //printf("got %s\n", buffer);
  288.                 vector<string> rcv; u ="";
  289.                 for(i = 0 ; i < strlen(buffer); i++)
  290.                 {
  291.                     if(buffer[i] == '_')
  292.                         rcv.push_back(u), u = "";
  293.                     else
  294.                         u.push_back(buffer[i]);
  295.                 }
  296.  
  297.                 string t2 = "", senderIP = "";
  298.                 for(string s : rcv)
  299.                 {
  300.                     k = 0; senderIP = "";
  301.                     while(k < s.length()) {
  302.                         if(s[k] == '|'){k++; break;}
  303.                         senderIP.push_back(s[k]); k++;
  304.                     }
  305.  
  306.                     u = "";
  307.                     while(k < s.length()){
  308.                         if(s[k] == '|'){k++; break;}
  309.                         u.push_back(s[k]); k++;
  310.                     }
  311.  
  312.                     v = "";
  313.                     while(k < s.length()){
  314.                         if(s[k] == '|'){k++; break;}
  315.                         v.push_back(s[k]); k++;
  316.                     }
  317.  
  318.                     t2 = "";
  319.                     while(k < s.length()){
  320.                         if(s[k] == '|'){k++; break;}
  321.                         t2.push_back(s[k]); k++;
  322.                     }
  323.  
  324.                     w = toInt(t2);
  325.  
  326.                     //senderIP u v w
  327.                     //cout<<senderIP<<" "<<u<<" "<<v<<" "<<w<<endl;
  328.  
  329.                     //see if i can go to any node via senderIP
  330.                     if(u != myIP)
  331.                     {
  332.                         if(routingTable[u].cost > routingTable[senderIP].cost + w)
  333.                         {
  334.                             routingTable[u].cost = routingTable[senderIP].cost + w;
  335.                             routingTable[u].next_hop = senderIP;
  336.                         }
  337.                     }
  338.                 }
  339.             }
  340.         }
  341.  
  342.         else{cout << "-1 received : ", printf("%s\n", buffer);
  343.         }
  344.  
  345.         memset(buffer, 0, sizeof(buffer));
  346.     }
  347.  
  348.     //--------------------------------------------------------------------
  349.  
  350.     return 0;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement