21.1 | When we run the program, there is no output. To prevent accidental reception of multicast datagrams that a server is not expecting, the kernel does not deliver multicast groups to a socket that has never performed any multicast operations (e.g., joining a group). What is happening here is that the destination address of the UDP datagram is 224.0.0.1, the all-hosts group that all multicast-capable nodes must join. The UDP datagram is sent as a multicast Ethernet frame and all the multicast-capable nodes receive the datagram since they all belong to the group. However, the kernel drops the received datagram since the process bound to the daytime port has not set any multicast options. |
21.2 | Figure E.14 shows a simple modification to the main function to bind the multicast address and port 0. Figure E.14 UDP client main function that binds a multicast address.mcast/udpcli06.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int sockfd; 6 socklen_t salen; 7 struct sockaddr *cli, *serv; 8 if (argc != 2) 9 err_quit("usage: udpcli06 <IPaddress>"); 10 sockfd = Udp_client(argv[1], "daytime", (void **) &serv, &salen); 11 cli = Malloc(salen); 12 memcpy(cli, serv, salen); /* copy socket address struct */ 13 sock_set_port(cli, salen, 0); /* and set port to 0 */ 14 Bind(sockfd, cli, salen); 15 dg_cli(stdin, sockfd, serv, salen); 16 exit(0); 17 } Unfortunately, on the three systems on which this was triedFreeBSD 4.8, MacOS X, and Linux 2.4.7all allowed the bind and then sent the UDP datagrams with a multicast source IP address. |
21.3 | 21.3 If we do this from our host aix, which is multicast-capable, we get the following: aix % Both systems on the right-hand Ethernet in Figure 1.16 respond.
|
21.5 | The value 1,073,741,824 is converted to a floating-point number and divided by 4,294,967,296, yielding 0.250. This is multiplied by 1,000,000, yielding 250,000, which in microseconds is one-quarter of a second. The largest fraction is 4,294,967,295, which divided by 4,294,967,296 yields 0.99999999976716935634. Multiplying this by 1,000,000 and truncating to an integer yields 999,999, the largest value for the number of microseconds. |