Q: Sometimes duplicate packets are inserted into the receiver's receive list and this causes subsequent problems. A: Our workaround (now posted) checks to make sure a packet is not present in the receive list before inserting. Q: When I call readWithTimer() with a specific value, like 2000ms, it often seems to wait much less time than that. Why? A: It turns out that the granularity of readWithTimer() is not very good. If you use the readwithTimer() call correctly, we will not deduct points when the actual waiting time is different from the time you attempted to specify. Q: Implementing timeouts correctly seems way complicated. A: That's true, but it's fine to implement a watered-down version. For each packet that you send, keep track of the time that you sent it using a function like gettimeofday(). Then, after you are done processing acks in the srmp_send () function, call gettimeofday() again to get the current time. If the discrepancy between the time now and the time for any unacknowledged packet is greater than 2 seconds, perform a timeout. If not, proceed normally. Feel free to implement a more refined version of this if you wish, but this is sufficient. Q: Why would I need to use the provided routine nonblock()? A: The function nonblock is needed since you do not want to "block" on a call to read(). For example, suppose you write a datagram and it is lost. If you try to call read() to read the acknowledgment that you expect, the default behavior is that read() is blocking, and you will wait indefinitely to read an acknowledgment that will never be sent. By converting the socket to "non-blocking", you can then use readWithTimer() to set a bound on how long you're willing to wait before giving up. Q: The specification for reset handling doesn't seem very robust. Should I worry about it? A: No. When your program detects a protocol error or receives a RESET message, just send a RESET and terminate. Q: I'm having trouble making on ieng6. What should I do? A: The environment is slightly different on ieng6 so we've provided a modified Makefile that works there (called Makefile.ieng6). You can just rename Makefile.ieng6 to Makefile nad it should work fine. We've also provided Makefile.ieng9 so you have a reference copy of the Makefile that works on ieng9.