The XBox 360 TCP stack does not respond to TCP Zero Window Probes with a 0-byte payload
I found a few things that may help:
TCP
ioctl(2)
TCP_NODELAY
will cause the kernel to send an immediate PSH packet. It might unstick the connection.TCP
ioctl(2)
TCP_QUICKACK
will do something funny with ACK packets. It might unstick the connection.If you use
send(2)
you can set theMSG_OOB
flag, which might poke the XBox right in the eye, get its attention, and maybe things can start over. CISCO wrote a nice summary of how different platforms respond to TCP URG, and their advice is to avoid using URG, but it's crazy enough it just might work.TCP socket option
TCP_CONGESTION
lets you select different congestion-avoidance algorithms. Maybe you could find one that helps avoids the filled windows in the first place? (At least TCP Vegas is implemented as a module, it might not be possible to change away from the default congestion avoidance algorithm on the android platform.)
Actually, you are running into a Linux bug. Linux is not RFC793 compliant when dealing with zero window situations. Windows is actually doing the correct thing. Note that RFC 793 does NOT require that the receiver send an unsolicited window update message. Instead, the requirement is that the sender send a window probe with at least ONE octet of data.
You may want to consider using UDP instead of TCP. I'm assuming you want the Xbox to play the audio, not create a copy of it locally? In which case you really don't care if you get every single packet reliably. The reliability of packet transmission is the overhead that you get with TCP, but maybe you don't really need it. UDP is much simpler and is more typical in streaming situations.