Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: @XSStringManolo en 27 Diciembre 2019, 16:11 pm



Título: Python 3.7 socket socket.gaierror errno7 cliente Android.
Publicado por: @XSStringManolo en 27 Diciembre 2019, 16:11 pm
Código
  1. import socket
  2. def MiSocket(hostname, port, content):
  3.    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4.    s.connect(("http://www.google.com", 80))
  5.    s.sendall(content)
  6.    s.shutdown(socket.SHUT_WR)
  7.    while 1:
  8.        data = s.recv(1024)
  9.        if data == "":
  10.            break
  11.        print ("Received: ")
  12.        print (data)
  13.    print ("Connection closed.")
  14.    s.close()
  15.  
  16. MiSocket("Los", "errores me", "tienen las bolas llenas xD")

File "<string>", line 16, in <module>
  File "<string>", line 4, in MiSocket
socket.gaierror: [Errno 7] No address associated with hostname

Si uso el wget, nc, navegador... Funciona bien.
Probé hardcodeando la IP en IPv4 e IPv6 y me tira exactamente el mismo error.


Título: Re: Python 3.7 socket socket.gaierror errno7 cliente Android.
Publicado por: engel lex en 27 Diciembre 2019, 16:25 pm
por lo que veo el error es aqui

Código
  1. s.connect(("http://www.google.com", 80))


gaierror es error en el get address info

basicamente le estas diciendo que se conecte el host "http://www.google.com" y cuando intenta hacer la resolucion, ese host es invalido porque tiene simbolos como : y / , y no puede resolver la direccion ip

en pocas palabras, pasa el host... no tienes que pasar el protocolo http:// porque socket no entiende eso, es una interfaz de bajo nivel


Título: Re: Python 3.7 socket socket.gaierror errno7 cliente Android.
Publicado por: @XSStringManolo en 28 Diciembre 2019, 00:09 am
por lo que veo el error es aqui

Código
  1. s.connect(("http://www.google.com", 80))


gaierror es error en el get address info

basicamente le estas diciendo que se conecte el host "http://www.google.com" y cuando intenta hacer la resolucion, ese host es invalido porque tiene simbolos como : y / , y no puede resolver la direccion ip

en pocas palabras, pasa el host... no tienes que pasar el protocolo http:// porque socket no entiende eso, es una interfaz de bajo nivel
Grache buen cheñor.

Si no me lo dices seguro que me habría tirado horas a intentar resolverlo. Habría probado hasta a crear un server DNS para que me resolviera el dominio creo yo.

Código
  1. import socket
  2. def cliente(host, puerto, contenido):
  3.    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4.    s.connect((host, puerto))
  5.    contenido="GET /index.html HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"
  6.    contenido = contenido.encode('utf-8')
  7.    s.sendall(contenido)
  8.    response = b''
  9.    while 1:
  10.        recv = s.recv(2048)
  11.        resp = repr(recv)
  12.        respT= len(resp)
  13.        if respT < 5:
  14.            break
  15.        response += recv
  16.    s.shutdown(socket.SHUT_WR)
  17.    s.close()
  18.    return response
  19.  
  20. respuesta = cliente("google.com" , 80 , 1)
  21. print(respuesta)
  22. print("Fin ejec")

Voy a ver si hago con un colega un rat multiplataforma que importe módulos con kivy o algo así que se ve chulo.