When modifying an existing application, you'll need to insert the CM dispatching into the existing event loop of that application. Don't just copy the blocking select code from one of our sample applications, because if you're unable to receive ACKs while blocked waiting for a write, your program may deadlock. This would be unfortunate.
Our test framework provides an example of how to do this.
Another option is to simply have your program dequeue packets from the socket buffer as rapidly as possible, but in general, you'll likely get best results (and save a system call) by using SO_TIMESTAMP.
In particular, if you send out variable sized packets, you'll need to use a little table to store the sizes of unacknowleged (or lost) packets so you can correctly report the size of the packet to the Congestion Manager. For simplicity, our test framework assumes that all packets are the same size.
If frequent packet reordering is an issue in your network, you'll want to delay reporting losses to the CM until you've determined that it wasn't due to packet reordering. The framework ignores this problem. Our framework does not detect a "lost feedback" condition (e.g. where the program has lost enough packets that it no longer has a reasonable idea of the state of the network).