Some simple stuff first:
IO::Socket sets the socket to autoflush, so all your ->flush() are useless.
$nonblocking = 1;
ioctl($sock, 0x8004667e, \$nonblocking);
is an awful way of writing
If I understand correctly, your problem is that two writes in quick succession end up being picked up by the second read of two reads in quick succession. If you consider that a problem, you're doing something majorly wrong. Maybe we can help you fix your actual problem if you tell us about it.