midterm

advertisement
CS 779/879
Design of Network Protocols
Spring 2013
Midterm Exam
Time 2 & 1/2 hours
Open Book
Name:
Login:
All questions are of equal weights.
Question 1: 20 points
A. If you are logged into a UNIX/LINUX host. How to find the name of that host, its IPv4 and IPv6
addresses?
B. If you know a host IPv4 address and you do not have a login access to that host, how to find the name
of that host, and its IPv6 addresses?
Question 2: 30 points
To allow two groups to exchange multicast messages we may use a udp tunnel between the two groups A and B
(e.g. ODU and UNC) as shown below:
The program mTunnel has the following syntax:
mTunnel <RemoteIP> <GroupIP> <Port>
Example:
We may run the mTunnel between two sites e.g. ODU ( host 128.82.4.98) & UNC (host
152.2.131.244) as follows:
ODU % mTunnel 152.2.131.244 224.0.0.3 10333
UNC % mTunnel 128.82.4.98
224.0.0.4 10333
Any person at ODU or at UNC may chat together by running the mcastChat as follows:
% mcastChat 224.0.0.3 10333
In such case you will see the messages exchanged between ODU and UNC chatters via the two mTunnel
programs running at 128.82.4.98 and 152.2.131.244.
The following is an outline code for the mTunnel program.
You are required to implement the missing function HandleTraffic() using the following three different
implementations:
1. Select
2. Thread
3. Fork
#define SA
struct sockaddr
int
UnicastSocket, MulticastSocket;
struct sockaddr_in RemoteAddress;
struct sockaddr_in LocalAddress;
struct sockaddr_in GroupAddress;
struct hostent *hp, *gethostbyname();
char
RemoteIP[100];
char
RemotePort[100];
char
GroupIP[100];
char
GroupPort[100];
char
LocalPort[100];
int main(int argc, char **argv)
{
strcpy(RemoteIP, argv[1]);
strcpy(GroupIP, argv[2]);
strcpy(LocalPort, argv[3]);
strcpy(RemotePort, argv[3]);
strcpy(GroupPort, argv[3]);
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_addr.s_addr = htonl (inet_addr (RemoteIP));
RemoteAddress.sin_port = htons(atoi(RemotePort));
LocalAddress.sin_family = AF_INET;
LocalAddress.sin_addr.s_addr = htonl(INADDR_ANY);
LocalAddress.sin_port = htons(atoi(LocalPort));
UnicastSocket = socket(AF_INET, SOCK_DGRAM, 0);
reusePort(UnicastSocket);
if (bind(UnicastSocket,(SA*)&LocalAddress, sizeof(LocalAddress))<0) {
close(UnicastSocket);
perror("binding UnicastSocket socket");
exit(-1);
}
GroupAddress.sin_family = AF_INET;
GroupAddress.sin_addr.s_addr = htonl (inet_addr (GroupIP));
GroupAddress.sin_port = htons(atoi(GroupPort));
MulticastSocket = socket(AF_INET, SOCK_DGRAM, 0);
reusePort(MulticastSocket);
if (bind(MulticastSocket,(SA*)&GroupAddress, sizeof(GroupAddress))<0) {
close(MulticastSocket);
perror("binding MulticastSocket socket");
exit(-1);
}
joinGroup(MulticastSocket, (char *) GroupIP);
setLoopback(MulticastSocket, 0);
HandleTraffic();
}
1. Select implementation:
2. Thread implementation:
3. Fork implementation:
Question 3: 30 points
Consider the following executions of Server and Client:
Q3Srv.c
int main(int argc, char *argv[])
{
int
sd;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
char
buf[512];
int
rc;
sd = socket(AF_INET,
reusePort(sd);
SOCK_DGRAM,
0);
server.sin_family = AF_INET;
server.sin_port = 10234;
if (argc == 1) server.sin_addr.s_addr = htonl(INADDR_ANY);
else if (argc == 2) {
server.sin_addr.s_addr = htonl (inet_addr (argv[1]));
joinGroup(argv[1]);
}
bind(sd, (SA *) & server, sizeof(server));
for (;;) {
rc = recv(sd, buf, sizeof(buf), 0);
buf[rc] = (char) NULL;
printf("Received: %s\n", buf);
}
}
A.
Assume we run the server simultaneously on different ssh windows on host something (128.82.4.210) as
follows in that order:
S1: Q3Srv 127.0.0.1
S2: Q3Srv 128.82.4.210
S3: Q3Srv 224.0.0.1
S4: Q3Srv
And assume we run the UDPClient1 on the same host something on different ssh windows as follows:
C1: UDPClient1 127.0.0.1
10234
C2: UDPClient1 128.82.4.210 10234
C3: UDPClient1 224.0.0.1
10234
Fill the following table with Y or N.
Y: means the server will receive the client messages.
N: means the server will NOT receive the client messages.
S1
S2
S3
S4
C1
C2
C3
B.
Repeat A if the UDPClient1 runs on host somethingels instead of something..
S1
C1
C2
C3
S2
S3
S4
Question 4:20 points
A. Consider the following program:
Q4Clt.c
main(int argc, char *argv[])
{
int
sendsock;
struct sockaddr_in dest;
struct sockaddr_in server;
char
sendBuf[512];
char
buf[512];
int
bytes;
int
rc;
dest.sin_family = AF_INET;
dest.sin_port = 10234;
dest.sin_addr.s_addr = inet_addr(argv[1]);
sendsock = socket(PF_INET,
reusePort(sendsock);
SOCK_DGRAM,
0);
if ( bind(sendsock, (SA *) &dest, sizeof(dest)) < 0) {
perror(“Error in binding sendsock”);
exit (-1);
}
sendto(sendsock, “HI”, 2, 0, (SA *) & dest, sizeof(dest));
while (;;) {
rc = recv(sendsock, buf, sizeof(buf), 0);
buf[rc] = NULL;
printf("Received Back: %s\n", buf);
}
}
Describe and explain what happens if we run the following clients on different ssh windows on host something
(128.82.4.210) as follows in that order:
C1: Q4Clt 128.82.4.210
C2: Q4Clt 128.82.4.210
C3: Q4Clt 128.82.4.210
What will happen if we run these programs as described above on any host other than something?
B. Consider the following program:
Q4Srv.c
main(int argc, char *argv[])
{
int sd;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
struct sockaddr_in from;
char buf[512];
int rc;
int len;
server.sin_family = AF_INET;
server.sin_port = 10234;
server.sin_addr.s_addr = htonl(INADDR_ANY);
sd = socket(AF_INET, SOCK_STREAM, 0);
reusePort(sd);
if ( bind(sd, (SA *) & server, sizeof(server)) < 0) {
perror(“sd bind failed”);
exit(-1);
}
listen(sd, 0);
psd = accept (sd, 0, 0);
while (1) {
len = sizeof(from);
rc = read(psd,buf,sizeof(buf));
buf[rc] = NULL;
printf("Received: %s\n", buf);
write (psd, buf, rc);
}
}
Describe and explain what happens if we run the following on different ssh windows on the same host as
follows in that order:
S1: Q4Srv
S2: Q4Srv
Download