Ordinadors en xarxa¶
Es demana dissenyar el programa ping.py que donat un rang d’adreces d’internet esbrini en quines hi ha un ordinador connectat i actiu. Al final de la sortida s’indicarà el temps que ha trigat en esbrinar-ho.
Per exemple,
$ python3 ping.py 147.83.29 20 24
147.83.29.20 : no respon
147.83.29.21 : no respon
147.83.29.22 : funciona
147.83.29.23 : no respon
Fet en 0:00:03.009748
Ho podem fer a partir de la comanda ping. La comanda ping envia a la xarxa paquets ECHO_REQUEST i espera que el computador on s’ha enviat li respongui en paquets ECHO_RESPONSE.
Si fem
$ ping 147.83.29.7
PING 147.83.29.7 (147.83.29.7) 56(84) bytes of data.
From 147.83.29.22 icmp_seq=1 Destination Host Unreachable
From 147.83.29.22 icmp_seq=2 Destination Host Unreachable
From 147.83.29.22 icmp_seq=3 Destination Host Unreachable
i mentre no el parem anirà enviant i reclamant que no té resposta per que a l’adreça 147.83.29.7 no hi ha cap computador.
En aquest altre exemple,
$ ping 147.83.29.3
PING 147.83.29.3 (147.83.29.3) 56(84) bytes of data.
64 bytes from 147.83.29.3: icmp_req=1 ttl=255 time=0.335 ms
64 bytes from 147.83.29.3: icmp_req=2 ttl=255 time=0.169 ms
64 bytes from 147.83.29.3: icmp_req=3 ttl=255 time=0.171 ms
64 bytes from 147.83.29.3: icmp_req=4 ttl=255 time=0.273 ms
64 bytes from 147.83.29.3: icmp_req=5 ttl=255 time=0.263 ms
64 bytes from 147.83.29.3: icmp_req=6 ttl=255 time=0.243 ms
l’adreça proposada té un computador que respon.
Si a la comanda ping posem l’opció -q ens farà un resum de tot el que ha passat i amb la opció -c podem dir quants requeriments d’eco enviem, i per tant quantes respostes esperem en un termini.
Per exemple,
$ ping -q -c2 147.83.29.5
PING 147.83.29.5 (147.83.29.5) 56(84) bytes of data.
--- 147.83.29.5 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.303/0.411/0.520/0.110 ms
$ ping -q -c2 147.83.29.254
PING 147.83.29.254 (147.83.29.254) 56(84) bytes of data.
--- 147.83.29.254 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
Des de python podem executar la comanda mitançant popen i la sortida de la comanda captar-la dins una variable per analitzar-la.
Si trobem una línia en que part del text està format per un nombre seguit de la paraula received podrem saber si l’ordinador en qüestió ha contestat o no. El mòdul re (Regular Expressions) ens serà útil per poder analitzar les línies del canal estàndard de sortida.
Un programa ping.py que fa el que es demana es mostra a continuació:
import sys, os, re, datetime
t1 = datetime.datetime.now()
if __name__ == "__main__":
if len(sys.argv)!=4:
sys.exit(os.EX_USAGE)
prog, subxarxa, ini, fi=sys.argv
nombrePaquetsRebuts = re.compile(r"(\d) received")
estat = ("no respon","no funciona del tot","funciona")
for sufix in range(int(ini),int(fi)):
ip = subxarxa+"."+str(sufix)
ping_out = os.popen("ping -q -c2 "+ip,"r")
print(ip+": ... ",end="")
for linia in ping_out:
nRebuts = nombrePaquetsRebuts.findall(linia)
if nRebuts!=[]:
print(estat[int(nRebuts[0])])
t2 = datetime.datetime.now()
print('Fet en ',t2 - t1)
Estudieu-lo. Ens han dit que pot anar més ràpid utilitzant fils de control (fork, threads, etc). Un cop heu entés què fa i com ho fa proposeu un nou programa que mitjançant el mòdul threading (1) proposi uns fils de control per realitzar la prestació que es demana.
El nou programa el posarem en un fitxer anomenat pingp.py i així poder fer proves per comprovar si és més ràpid que el programa ping.py.
computadors <Category:Estructura_i_funcionament_de_computadors>`__ Category:Exercici