Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Panic0 en 20 Agosto 2020, 03:06 am



Título: Sockets
Publicado por: Panic0 en 20 Agosto 2020, 03:06 am
Chicos soy nuevo en esto de los sockets,logre hacer esto...¿Pero mi pregunta es con que puedo seguir ahora?
Servidor
Código:
import socket 
mi_socket = socket.socket()
mi_socket.bind(('192.168.1.31',8000 ))
mi_socket.listen(5) 


while True:
   conexion, addr = mi_socket.accept()
   print ("Nueva conexion establecida!")
   print(addr)
   respuesta1 = conexion.recv(1024)
   print(respuesta1)
   mensajeServidor = "Hola, te saludo desde el servidor!"
   conexion.send(mensajeServidor.encode())
   conexion.close() 
Cliente
Código:
import socket
mi_socket = socket.socket()
mi_socket.connect (('192.168.1.31', 8000))
MensajeCliente = "Hola, te saludo desde el cliente!"
mi_socket.send(MensajeCliente.encode())
repuesta = mi_socket.recv(1024).decode()
print(repuesta)


Título: Re: Sockets
Publicado por: Drakaris en 20 Agosto 2020, 12:56 pm
A que te refieres con...?
Citar
Pero mi pregunta es con que puedo seguir ahora?
Puedes hacer lo que quieras. ¿Que quieres hacer? Puedes hacer desde una red de conexiones hasta un backdoor. ¿Que quieres hacer con ello?

Si quieres aprender a hacer conexiones sockets. Unicamente no te limites a seguir tutoriales. Esta bien para aprender los fundamentos. Pero aprenderás más cuando te pongas una meta y hagas un proyecto (no hace falta grande) que conlleve esto.

Te recomiendo que en la funcion bind() el string este vacio, ya que esta escuchando conexiones.
Código
  1. mi_socket = socket.socket()
  2. mi_socket.bind(('',8000 ))
  3. mi_socket.listen(5)  
  4.  

A no ser que quiera que escuche hacia una IP especifica.

Además estas creando un objeto socket.socket(), cuando creas un funcion socket sin parametros, por defecto estas creando un socket con paquetes TCP/IP y IPv4

Código
  1. mi_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
El primer parametro especifica el tipo de familia (IPv4, IPv6) y el segundo el tipo de paquete (TCP/UDP). Mira la documentación oficial
Doc: https://docs.python.org/3/library/socket.html?highlight=socket#socket.socket

Además. Estas trabajando en localhost? Si es así en el servidor cambia el:
Código
  1. mi_socket.bind(('192.168.1.31',8000 ))
a
Código
  1. mi_socket.bind(('',8000 ))

y en el cliente:
Código
  1. mi_socket.connect(('192.168.1.31', 8000))
a
Código
  1. mi_socket.connect(('127.0.0.1', 8000))
recuerda que 127.0.0.1/localhost es el loopback en IPv4 y en IPv6 es ::1

He probado tu código y va bién. Unicamente es que en el lado del servidor cuando muestras el mensaje, se muestra en b'[texto]'.
Código
  1. print(repuesta1) #output: b'Hola, te saludo desde el servidor!'
, reemplaza la linea a:
Código
  1. print(repuesta1.decode()) #output: Hola, te saludo desde el servidor!

Ejemplo de conexion socket

Server:
Código
  1. #!/usr/bin/python3
  2. import socket, sys
  3. mi_socket = socket.socket()
  4. mi_socket.bind(('',8000 ))
  5. mi_socket.listen(5)  
  6.  
  7. while True:
  8.  try:
  9.   conexion, addr = mi_socket.accept()
  10.   print ("Nueva conexion establecida!")
  11.   print(addr)
  12.   while True:
  13.      respuesta1 = conexion.recv(1024)
  14.      if respuesta1.decode() == "close":
  15.        print("closing server....")
  16.        mi_socket.close()
  17.        sys.exit()
  18.      else:
  19.        print(respuesta1.decode())
  20.  except KeyboardInterrupt: # presiona Ctrl+C
  21.    print("\nclosing server....")
  22.    break
  23. mi_socket.close()
  24. sys.exit()
  25.  

client:
Código
  1. #!/usr/bin/python3
  2. import socket
  3. mi_socket = socket.socket()
  4. mi_socket.connect (('127.0.0.1', 8000))
  5. MensajeCliente = "Hola, te saludo desde el cliente!"
  6. mi_socket.send(MensajeCliente.encode())
  7. while True:
  8. prompt = input("> ")
  9. if prompt == "close":
  10. print("closing client...")
  11. mi_socket.send(b"close")
  12. break
  13. elif prompt != "":
  14. mi_socket.send(prompt.encode())
  15. mi_socket.close()
  16.  

(https://imagizer.imageshack.com/v2/800x600q90/923/r5rLWy.png)


Esta conexion, te permite enviar mensajes, y en el lado del servidor los imprime, además si le envias la palabra "close", el servidor al recibir cuya palabra, envia al cliente GoodBye, y cierra el server. Y cuando el cliente recibe el GoodBye este se cierra. Además si hacer Ctrl+C en el script del servidor, este se cierra.