We have two applications, one using TCP and the other using UDP. 4,096 bytes are in the receive buffer for the TCP socket and two 2,048-byte datagrams are in the receive buffer for the UDP socket. The TCP application calls read with a third argument of 4,096 and the UDP application calls recvfrom with a third argument of 4,096. Is there any difference?
What happens in Figure 8.4 if we replace the final argument to sendto (which we show as len) with clilen?
Compile and run the UDP server in Figures 8.3 and 8.4 and then the UDP client in Figures 8.7 and 8.8. Verify that the client and server work together.
Run the ping program in one window, specifying the -i 60 option (send one packet every 60 seconds; some systems use -I instead of -i), the -v option (print all received ICMP errors), and the loopback address (normally 127.0.0.1). We will use this program to see the ICMP port unreachable returned by the server host. Next, run our client from the previous exercise in another window, specifying the IP address of some host that is not running the server. What happens?
We said with Figure 8.5 that each connected TCP socket has its own socket receive buffer. What about the listening socket; do you think it has its own socket receive buffer?
Use the sock program (Section C.3) and a tool such as tcpdump (Section C.5) to test what we claimed in Section 8.10: If the client binds an IP address to its socket but sends a datagram that goes out some other interface, the resulting IP datagram still contains the IP address that was bound to the socket, even though this does not correspond to the outgoing interface.
Compile the programs from Section 8.13 and run the client and server on different hosts. Put a printf in the client each time a datagram is written to the socket. Does this change the percentage of received packets? Why? Put a printf in the server each time a datagram is read from the socket. Does this change the percentage of received packets? Why?
What is the largest length that we can pass to sendto for a UDP/IPv4 socket, that is, what is the largest amount of data that can fit into a UDP/IPv4 datagram? What changes with UDP/IPv6?
Modify Figure 8.8 to send one maximum-size UDP datagram, read it back, and print the number of bytes returned by recvfrom.
Modify Figure 8.25 to conform to RFC 1122 by using IP_RECVDSTADDR for the UDP socket.