import sys, socket, datetime # Switch UDP sur port 7778 et reponse au meme port # protoyupe packet mis bout a bout # accepte les paquets vides trace=0 if len(sys.argv)>1 : if sys.argv[1]=="-t" : trace=1 if len(sys.argv) !=2+trace: print "appel sudo python "+sys.argv[0]+" [-t] port " sys.exit() port=int(sys.argv[1+trace]) trace=1 noadd=("","") pilead=noadd facead=noadd nompile="" nomface="" aller="." retour="." pile=["",""] token=["",""] sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('',port)) print " SwitchPackets UDP port ", port," (frapper ^C pour abandonner)\n" while 1: while 1: (buf, address)=sock.recvfrom(2048) if trace: print "- - - - " done=0 if not len(buf): pass # isoler destinataire if trace: print "paquet recu:" , address,buf if (buf.find(":")<=0): print "pas exp/dest erreur venant de " , address break fromto=buf[:buf.find(":")] #si chgt RAZ if (fromto!=token[0]) and (fromto!=token[1]) : if (buf.find(">")<=0): print "pas >dest erreur venant de " , address break if trace: print "accepte fromto=", fromto token[0]=fromto token[1]=fromto[fromto.find(">")+1:]+">"+fromto[:fromto.find(">")] if trace: print "NEW ", token cmd="?" # pour releve sans envoi contenu="" # commande # ? = releve sans envoi # = = envoi if len(buf)>len(fromto)+1: cmd=buf[buf.find(":")+1] contenu=buf[buf.find(":")+1:] connus="?=" if connus.find(cmd)<0 : print "command unknown " , cmd, " in " , buf break if cmd=="?": if trace: print "relever seulement" if cmd=="=": if trace: print "ajouter et relever " # contenu=buf[len(fromto):] debut="" vavient=0 if fromto==token[1]: vavient=1 if trace : print "paquet provenant de " , vavient if cmd=="=": pile[vavient]=pile[vavient]+buf # reponse if trace: print "chercher ",token[1-vavient]," dans ",pile[1-vavient] ideb=pile[1-vavient].find(token[1-vavient],1) ideb0=pile[1-vavient].find(token[1-vavient],0) if trace: print "dans ",vavient," ideb=",ideb," ideb0=",ideb0 debut="" if ideb>1: if trace: print "multiple" debut="="+pile[1-vavient][:ideb] pile[1-vavient]=pile[1-vavient][ideb:] if (ideb==-1) and (ideb0==0): debut="="+pile[1-vavient] pile[1-vavient]="" sock.sendto(debut, address) if trace: print "repondu de ",1-vavient," : <<<<" +debut+">>>>" done=1 if trace: print "buffer reste :" ,vavient,pile[vavient] if trace: print "buffer reste :" ,1-vavient, pile[1-vavient] if (done == 0): print "errrur ",buf,address sock.sendto("error: "+buf, address) if trace: print "niveau 1"