summaryrefslogtreecommitdiff
path: root/common/udpovertcp.py
diff options
context:
space:
mode:
Diffstat (limited to 'common/udpovertcp.py')
-rw-r--r--common/udpovertcp.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/common/udpovertcp.py b/common/udpovertcp.py
new file mode 100644
index 0000000..eae3d6b
--- /dev/null
+++ b/common/udpovertcp.py
@@ -0,0 +1,46 @@
+from socket import *
+from msgstruct import *
+#from fcntl import ioctl
+#from termios import TIOCOUTQ
+from zlib import compressobj, Z_SYNC_FLUSH
+import struct
+
+ZeroBuffer = struct.pack("i", 0)
+
+
+class SocketMarshaller:
+
+ def __init__(self, tcpsock, mixer):
+ self.tcpsock = tcpsock
+ self.mixer = mixer
+ self.mixer_can_mix = mixer.send_can_mix
+ self.mixer_send = mixer.send_buffer
+ self.tcpsock_fd = tcpsock.fileno()
+ # try to reduce TCP latency
+ try:
+ tcpsock.setsockopt(SOL_IP, IP_TOS, 0x10) # IPTOS_LOWDELAY
+ except error, e:
+ print "Cannot set IPTOS_LOWDELAY for client:", str(e)
+ try:
+ tcpsock.setsockopt(SOL_TCP, TCP_NODELAY, 1)
+ except error, e:
+ print "Cannot set TCP_NODELAY for client:", str(e)
+ compressor = compressobj(6)
+ self.compress = compressor.compress
+ self.compress_flush = compressor.flush
+
+ def send(self, data):
+ if self.mixer_can_mix():
+ # discard all packets if there is still data waiting in tcpsock
+ # --- mmmh, works much better without this check ---
+ #try:
+ # if ioctl(self.tcpsock_fd, TIOCOUTQ, ZeroBuffer) != ZeroBuffer:
+ # return
+ #except IOError, e:
+ # print "ioctl(TIOCOUTQ) failed, disconnecting client"
+ # self.mixer.disconnect(e)
+ #else:
+ data = self.compress(data) + self.compress_flush(Z_SYNC_FLUSH)
+ self.mixer_send(message(MSG_INLINE_FRAME, data))
+ return len(data)
+ return 0