We will simulate a very simple network by having a process correspond to a node
ID: 3576691 • Letter: W
Question
We will simulate a very simple network by having a process correspond to a node in the network, and files correspond to channels in the network.
We will have at most 10 nodes in the network, nodes 0 , 1, 2, . . . , 9, or LESS, not all nodes need to be present.
Each process (i.e. node) is going to be given the following arguments
id of this node (i.e., a number from 0 to 9)
the duration, in seconds, that the node should run before it terminates
the destination id of a process to which the transport protocol should send data
a string of arbitrary text which the transport layer will send to the destination
a list of id's of neighbors of the process
We will have a single program foo.c (or foo.java, or foo.cc whatever) which has the code for a node. Since we have multiple nodes, we will run the same program multiple times, in parallel. The only difference between each of the copies of the program running in parallel are the arguments to the program.
For example, assume I have two programs, A and B, and I want to run them at the same time. At the Unix prompt >, I would type the following
> A &
> B &
By typing the & we are putting the program in the "background", i.e., the program runs in the background and you can keep typing things at the terminal. Therefore, A and B are running in parallel at the same time.
Again, let foo be your program that represents a node. The arguments of the program are as follows
foo 3 100 5 "this is a message" 2 1
The following would execute the program foo, and the first argument is the id of the node (3), the second is the number of seconds the process will run (100), followed by the destination for this node (5), then the message string "this is a message", and ending in a list of neighbors (i.e. 2 and 1 are neighbors of 3)
For example, assume I have a network with three nodes, 0 , 1, 2, and I want node 0 to send a string "this is a message from 0" to node 2, and node 1 to send a message "this is a message from 1" to node 2. Also, assume 0 and 1 are neighbors, and 1 and 2 are neighbors. Then I would execute the following commands at the Unix prompt > (your prompt may, of course, be different)
> foo 0 100 2 "this is a message from 0" 1 &
> foo 1 100 2 "this is a message from 1" 0 2 &
> foo 2 100 2 1 &
This will run three copies of foo in the background, the only difference between them are the arguments each one has.
For node 2, since the "destination" is 2 itself, this means 2 should not send a transport level message to anyone, and the list of neighbors is just node 1
The channels will be modeled via files. File name "from0to1" corresponds to the channel from node 0 to node 1. Therefore, node 0 opens this file for writing and node 1 opens this file for reading. File name "from1to0" corresponds to the channel from node 1 to node 0, and process 1 opens this file for writing and process 0 opens this file for reading.
Program foo (which represents a node) will contain a transport layer, a network layer, and a data link layer.
I need help with the Files part of the program.
Here is my code so far.
Explanation / Answer
#include <stdlib.h>
#include <cstring>
#include <stdio.h>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <fcntl.h>
using namespace std;
int id;
int duration;
int dest;
string str;
std::vector<int> neighbors;
int main(int argc, char* argv[])
{
cout << "Arg" << " " << endl;
for(int i = 0; i < argc; i++)
{ cout << " " << i << " " << " " << argv[i] << endl;
}
cout << endl;
/*
cout << "Begining of code initialize variables" << endl;
id = atoi(argv[1]);
duration = atoi(argv[2]);
dest = atoi(argv[3]);
cout << id << endl;
cout << duration << endl;
cout << dest << " " << endl;
/*
cout << "Initialize and test neighbors" << endl;
for (int i = 5; i < argc; i++)
{
neighbors.push_back(atoi(argv[i]));
}
for (int i = 0; i < neighbors.size(); i++)
{
cout << neighbors[i] << " ";
}
cout << endl;
cout << "Initialize and test filename" << endl;
string writefile = "from";
writefile += argv[1];
writefile += "to";
writefile += argv[3];
cout << writefile << " " << endl;
*/
if (strtol(argv[4],NULL,0) != 0 )
{
//checking for initialization without a string. ie. list of neighbors only
// foo 2 100 2 1 ... &
// 0 1 2 3 4 ...1
for (int i = 4; i < argc; i++)
{
neighbors.push_back(atoi(argv[i]));
}
}
else
{
//assuming any other initialization will include string and <= 10 number of neighbors
// foo 2 100 1 "test" 2 1 ... &
// 0 1 2 3 4 5 6 ...
str = argv[4];
for (int i = 5; i < argc; i++)
{
neighbors.push_back(atoi(argv[i]));
}
string writefile = "from";
writefile += argv[1];
writefile += "to";
writefile += argv[3];
writefile += ".txt";
cout << writefile << " " << endl;
ofstream channel;
channel.open(writefile);
channel << str;
channel.close();
}
id = atoi(argv[1]);
duration = atoi(argv[2]);
dest = atoi(argv[3]);
cout << "End of code initialize" << endl;
cout << "Id Duration Dest Msg neighbors" << endl;
cout << id << " " << duration << " " << dest << " " << str << " ";
for (int i = 0; i < neighbors.size(); i++)
{
cout << neighbors[i] << " ";
}
cout << " " << endl;
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.