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