7 Langage Python : objet
-
Un vernis objet avec le mot clef class.
- Variables et méthode privées avec le préfixe __.
- Pas de polymorphisme, utiliser des méthodes de classe.
- Héritage multiple.
class paquetIPv4:
version=4
tailleEntete=5
tailleTotale=20
duree=64
protocole=0
somme=0
source=[]
cible=[]
donnees=[]
def __init__(self,source,cible,protocole,donnees):
self.source=source
self.cible=cible
self.protocole=protocole
self.donnees=donnees
self.tailleTotale=self.tailleEntete*4+len(donnees)
self.somme=somme(self.entetes())
@classmethod
def brut(classe,brut):
protocole=brut[9]
source=brut[12:16]
cible=brut[16:20]
donnees=brut[20:]
paquet=classe(source,cible,protocole,donnees)
paquet.version=brut[0]>>4
paquet.tailleEntete=brut[0]&0x0f
paquet.tailleTotale=brut[2]<<8|brut[3]
paquet.duree=brut[8]
paquet.somme=brut[10]<<8|brut[11]
return paquet
def adresses(self):
return self.source,self.cible
def liste(self):
return [ (self.version<<4)|self.tailleEntete, 0x00, *self.tailleTotale.to_bytes(2,byteorder='big'),
0x00, 0x00, 0x00, 0x00,
self.duree, self.protocole, *self.somme.to_bytes(2,byteorder='big'),
*self.source, *self.cible] + self.donnees
def entetes(self):
return self.liste()[0:self.tailleEntete*4]
def taille(self):
return self.tailleTotale
def valide(self):
return somme(self.entetes())==0
class paquetUDP(paquetIPv4):
portSource=0
portCible=0
sommeUDP=0
donneesUDP=[]
def __init__(self,IPSource,IPCible,portSource,portCible,donnees):
self.portSource=portSource
self.portCible=portCible
self.donneesUDP=donnees
paquetUDP=self.listeUDP()
pseudo_entetes=IPSource+IPCible+[*(len(self.donneesUDP)+8).to_bytes(2,byteorder='big')]+[0x00,0x11]
self.sommeUDP=somme(pseudo_entetes+paquetUDP);
bytes=self.sommeUDP.to_bytes(2,byteorder='big')
paquetUDP[6],paquetUDP[7]=bytes[0],bytes[1]
paquet=super().__init__(IPSource,IPCible,0x11,paquetUDP)
@classmethod
def brut(classe,brut):
paquet=paquetIPv4.brut(brut)
paquetUDP=paquet.donnees;
paquet.portSource=paquetUDP[0]<<8|paquetUDP[1]
paquet.portCible=paquetUDP[2]<<8|paquetUDP[3]
paquet.sommeUDP=paquetUDP[4]<<8|paquetUDP[5]
paquet.donneesUDP=paquetUDP[8:]
return paquet
def ports(self):
return self.portSource,self.portCible
def __pseudo_entetes(self):
return self.source+self.cible+[*(len(self.donneesUDP)+8).to_bytes(2,byteorder='big')]+[0x00,0x11]
def listeUDP(self):
entetesUDP=[ *self.portSource.to_bytes(2,byteorder='big'), *self.portCible.to_bytes(2,byteorder='big'),
*(len(self.donneesUDP)+8).to_bytes(2,byteorder='big'), *self.sommeUDP.to_bytes(2,byteorder='big') ]
return entetesUDP+self.donneesUDP
def tailleUDP(self):
return len(self.donneesUDP)
def valide(self):
IPvalide=super().valide()
UDPvalide=(somme(self.__pseudo_entetes()+self.listeUDP())==0)
return (IPvalide and UDPvalide)
>>> p1=paquetIPv4([192,168,0,1],[192,168,0,10],0x01,[0x08,0x00,0xf7,0xff])
>>> p1.liste()
[69, 0, 0, 24, 0, 0, 0, 0, 64, 1, 249, 137, 192, 168, 0, 1, 192, 168, 0, 10, 8, 0, 247, 255]
>>> p2=paquetIPv4.brut(p1.liste())
>>> p2.liste()==p1.liste()
True
>>> p2.adresses()
([192, 168, 0, 1], [192, 168, 0, 10])
>>> p3=paquetUDP([192,168,0,1],[192,168,0,10],1024,2048,[1,2,3,4])
>>> p3.adresses()
([192, 168, 0, 1], [192, 168, 0, 10])
>>> p3.ports()
(1024, 2048)
>>> p3.protocole
17
>>> p3.liste()
[69, 0, 0, 32, 0, 0, 0, 0, 64, 17, 249, 113, 192, 168, 0, 1, 192, 168, 0, 10, 4, 0, 8, 0, 0, 12, 110, 116, 1, 2, 3, 4]
>>> p3.valide()
True
>>> p4=paquetUDP.brut([69, 0, 0, 32, 0, 0, 0, 0, 64, 17, 248, 113, 192, 168, 0, 1, 192, 168, 0, 10, 4, 0, 8, 0, 0, 12, 110, 116, 1, 2, 3, 4])
>>> p4.valide()
False