AntiGuide: UdpSwitchPythonTestlight



PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes 216.73.216.172 :: Signaler un abus :: le: 20250805 16:27:01
UdpSwitchPython

obsolete


ci dessous version 1 à 1,
on pourrait faire mieux

état de l'art:
- à chaque paquet reçu le switch:

pour l'exemple de client présenté plus bas:
- à chaque ligne frappée sur un des clients
  • GAFFE: le dessin du client est bloquant! en as de non réponse du switch
    pour les clients voir:

    switch
    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"