A:FD_READ (recv:Aすれば 01234
B:FD_READ (recv:Bすれば ABC
A:FD_READ (recv:Aすれば 56789
B:FD_READ (recv:Bすれば DEFG

recv:A で得られたものと recv:B で得られたものを
1つのバッファに連結するという発想に陥っているのだろうか?

それとも、、recvの際にソケット識別子を(渡ってきたものを使わずに)自前解釈で決め撃ちしてるのか?