A couple of comments:
- I don't understand the point of the second member in the tuple
- the timeout logic should be fixed so that the total operation time doesn't exceed the timeout, rather than each iteration (in other words, a deadline should be computed at the start and then the poll / select calls be issued in accordance with that deadline)
- non-blocking sockets could be supported by returning partial writes, and letting the caller pass an offset argument
- as a vocabulary nit, I don't really understand what "mmap-like file" means