Ok, done for tonight. Why the exact same failure happens at the exact same place on Linux as Windows suggests it can't purely be Boost.ASIO, because on Linux I myself do preadv() and pwritev() directly and he still fails with more than one buffer (on Linux there is no 64Kb transfer limit though, that *is* working). Something with more than one buffer must be introducing some sort of failure somewhere somehow :(