2 votes

Python script retourne --> socket.error : [Errno 98] L'adresse est déjà utilisée

Je suis nouveau sur Linux et j'ai actuellement un problème lors de l'exécution d'un script Python sur mon deuxième ordinateur portable (ce qui est étrange c'est que sur mon autre machine le script s'exécute sans aucun problème).

script qui est exécuté :

import socket

class DNSQuery:
def __init__(self, data):
self.data=data
self.dominio=''

tipo = (ord(data[2]) >> 3) & 15
if tipo == 0:
ini=12
lon=ord(data[ini])
while lon != 0:
self.dominio+=data[ini+1:ini+lon+1]+'.'
ini+=lon+1
lon=ord(data[ini])

def respuesta(self, ip):
packet=''
if self.dominio:
  packet+=self.data[:2] + "\x81\x80"
  packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x00'
  packet+=self.data[12:]
  packet+='\xc0\x0c'
  packet+='\x00\x01\x00\x01\x00\x00\x00\x3c\x00\x04'
  packet+=str.join('',map(lambda x: chr(int(x)), ip.split('.')))
  return packet

 if __name__ == '__main__':
 ip='192.168.1.1'
 print 'pyminiDwebconfNS:: dom.query. 60 IN A %s' % ip

 udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 udps.bind(('',53))

try:
while 1:
  data, addr = udps.recvfrom(1024)
  p=DNSQuery(data)
  udps.sendto(p.respuesta(ip), addr)
  print 'Request: %s -> %s' % (p.dominio, ip)
except KeyboardInterrupt:
print 'Finalizando'
udps.close()

L'erreur suivante s'est produite :

root@Sn3rpOs /m/r/B4A9-733B# python dns.py 

pyminifakeDwebconfNS:: dom.query. 60 IN A 192.168.1.1
Traceback (most recent call last):
File "dns.py", line 33, in <module>
udps.bind(('',53))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use

J'ai déjà essayé de changer l'adresse IP, mais sans succès, quelle que soit l'IP définie, l'erreur se produit.

J'ai ensuite vérifié avec "netstat -an" pour voir si 192.168.1.1 est bloqué, mais je n'ai rien trouvé.

B4A9-733B# netstat -an

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           
Foreign   Address               State      
tcp        0      0 127.0.0.1:5939          0.0.0.0:*                  
tcp        0      0 127.0.0.1:53            0.0.0.0:*                  
tcp        0      0 127.0.0.2:53            0.0.0.0:*                  
tcp        0      0 127.0.0.1:8118          0.0.0.0:*                   
tcp        0      0 127.0.0.1:9050          0.0.0.0:*                   
tcp        0      0 127.0.0.1:9051          0.0.0.0:*                   
tcp        0      1 192.168.179.135:57008   151.101.193.69:80         
tcp        0   2824 192.168.179.135:57376   151.101.193.69:80       
tcp        0      1 192.168.179.135:34152   151.101.65.69:80        
tcp        0    644 192.168.179.135:50030   151.101.129.69:80       
tcp        0      1 192.168.179.135:34154   151.101.65.69:80        
tcp        0      0 127.0.0.1:9050          127.0.0.1:34242         
tcp        0      0 192.168.179.135:54362   178.62.201.15:9090      
tcp        0      1 192.168.179.135:57014   151.101.193.69:80        
tcp6       0      0 ::1:8118                :::*                        
udp        0      0 127.0.0.1:47649         127.0.0.1:53            
udp        0   2560 0.0.0.0:41994                                    
udp        0      0 127.0.0.1:50619         127.0.0.1:53            
udp        0      0 127.0.0.1:36289         127.0.0.1:53              

Mon problème est que je ne comprends pas bien l'erreur signalée et ce que je pourrais vérifier/modifier pour y remédier. J'espère que vous pourrez me donner quelques idées supplémentaires pour résoudre ce problème.

Merci Chimère

1voto

Ofer Arial Points 819

Cette ligne :

udps.bind(('',53))

lie le socket pour que vous puissiez écouter INADDR_ANY - tout hôte entrant. Il a rien en rapport avec l'adresse IP " 192.168.1.1 ". L'adresse utilisée est en fait (localhost, 53) .

Votre erreur implique que vous avez déjà un programme en cours d'exécution sur le port 53 (il est occupé) et que vous ne pouvez donc pas le lier au port udp. Vous pouvez vérifier cela à partir de netstat, où vous voyez que le port est occupé.

Essayez de mettre fin au processus qui s'exécute sur le port 53 de votre machine et réessayez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X