summaryrefslogtreecommitdiffstats
path: root/cholerab/cholerab-live/chol_net.py
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2011-07-24 04:13:44 +0200
committermakefu <github@syntax-fehler.de>2011-07-24 04:13:44 +0200
commitf1f12489514f47f9154f8e4b6232399e747cfcd8 (patch)
tree1066d68dcc104cd8376c16378ac399253fd71763 /cholerab/cholerab-live/chol_net.py
parent531d9d4309fa09e893a19fdcf8165dc7bf1b3731 (diff)
emergency commit
Diffstat (limited to 'cholerab/cholerab-live/chol_net.py')
-rw-r--r--cholerab/cholerab-live/chol_net.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/cholerab/cholerab-live/chol_net.py b/cholerab/cholerab-live/chol_net.py
new file mode 100644
index 00000000..b5820973
--- /dev/null
+++ b/cholerab/cholerab-live/chol_net.py
@@ -0,0 +1,81 @@
+from socket import socket, AF_INET,SOCK_DGRAM,IPPROTO_UDP,SOL_SOCKET,SO_REUSEADDR,IP_MULTICAST_TTL,IP_MULTICAST_LOOP,INADDR_ANY,inet_aton,IP_ADD_MEMBERSHIP,IPPROTO_IP
+import struct
+import threading
+import logging
+log = None
+from select import select
+GROUP = '224.110.42.23'
+PORT = 42023
+log = logging.getLogger('CholerabNet')
+class CholerabMulicastNet(threading.Thread):
+ def __init__(self,cholerab,group=GROUP,port=PORT):
+ threading.Thread.__init__(self)
+ self.cholerab=cholerab
+ self.group=group
+ self.port=port
+ self.initSocket()
+ def send_char(self,x,y,char):
+ """ translates given params into network message """
+ self.send_mc("%s %d %d" %(str(char),x,y))
+ def send_mc(self,arg):
+ """ Sends message via multicast"""
+
+ try:
+ log.debug("Sending '%s' to %s:%d" % (arg,self.group,self.port))
+ self.s.sendto("%s" % arg,0,(self.group,self.port))
+ except Exception ,e:
+ log.error("IN send_mc:%s"%str(e))
+
+ def initSocket (self,rcv=1):
+ ''' Initializes a Multicast socket '''
+ host = ''
+ log.debug("Setting up Multicast Socket")
+ self.s = socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP)
+ self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
+ self.s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, 32)
+ self.s.setsockopt(IPPROTO_IP,IP_MULTICAST_LOOP,1) # we do not want our own packets to be replayed
+ if rcv==1:
+ log.debug("Configuring for Read AND Write")
+ self.s.bind((host,PORT))
+ mreq = struct.pack("4sl", inet_aton(GROUP), INADDR_ANY)
+ self.s.setsockopt(IPPROTO_IP,IP_ADD_MEMBERSHIP,mreq)
+ def run(self):
+ self.running = 1
+ while self.running:
+ # break if we do not want to loop on
+ ready,output,exception = select([self.s],[],[],1) # try every second
+ for r in ready:
+ if r == self.s:
+ (data,addr) = self.s.recvfrom(1024)
+ log.debug("Received Data from %s, data %s"%(str(addr),str(data)))
+ self.receive_net(addr,data)
+
+ def send_stupid(self,addr):
+ """ sends YOU ARE MADE OF STUPID to the right host """
+ #TODO implement me
+ pass
+
+ def receive_net(self,addr,data):
+ """ resolves which nick sent the message
+ TODO handle user resolution in mulicast """
+ def decode():
+ pass #TODO implement me
+
+ #FIXME TODO using port as host identification is probably just plain wrong, fix me for real net!
+ try:
+ address,port = addr
+ user = port
+ arr = str(data).split()
+ char = arr[0]
+ x = arr[1]
+ y = arr[2]
+ self.cholerab.write_char(int(x),int(y),char,user)
+ except Exception, e:
+ log.error("Triggered YOU ARE MADE OF STUPID: %s" % str(e))
+ self.send_stupid(addr)
+
+ def stop(self):
+ '''
+ stops the whole treading stuff gracefully
+ '''
+ self.running=0