Your current code returns bytes read even if the function hit timeout. This changes usage of this function as applications needs to compare return value with desired value. If those 2 doesn't match means a "bad" timeout. Doesn't this alter the API?
If you put the additional code into socket::read and added an addition timeout with a default value to the function's signature, I don't have to change anything for vnsi. And I think the other addons are fine as well.