comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[Python] Underch4t v1.0 (Parte 4)

  • 4 Respuestas
  • 1750 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Enero 03, 2016, 09:34:09 pm »

UnderCh4t



Bienvenidos a la cuarta entrega de esta serie. Poco a poco vamos armando nuestro humilde pero querido UnderCh4t. Si es la primera vez que escuchás hablar de esta serie o, por el contrario, ya lo hiciste pero te interesa repasar algunos conceptos, entonces te invito a pasar por los posts anteriores:

    - No tienes permisos para ver links. Registrate o Entra con tu cuenta
    - No tienes permisos para ver links. Registrate o Entra con tu cuenta
    - No tienes permisos para ver links. Registrate o Entra con tu cuenta

Muy bien. Mencionamos dos problemas al final de la tercera entrega:
    - establecer una charla con el cliente (intercambiar información)
    - recibir más de un cliente y de forma simultánea.

Debido a que el tema de threading es un poco complejo (sólo un poco jeje), lo vamos a ir explicando de a poco, en dos entregas o más (dependerá del tiempo que disponga para escribir). Hoy, mientras tanto, nos enfocaremos en el primero de los problemas citados. Comencemos!



INTERCAMBIANDO INFORMACIÓN


Como vimos en la entrega anterior, hasta ahora no le damos un buen servicio al cliente. Cada vez que se conecta, se imprime su dirección de red y se cierran ambos sockets (el del cliente y el del servidor). Repasemos el código:

Código: Python
  1. # -*- coding: utf-8 -*-
  2. import socket
  3.  
  4. # creamos socket para el servidor
  5. servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6.  
  7. # establecemos interfaz de conexión
  8. servidor.bind(("0.0.0.0", 2236))
  9.  
  10. # modo pasivo y backlog
  11. servidor.listen(5)
  12.  
  13. # aceptamos al cliente
  14. cliente, direccion = servidor.accept()
  15.  
  16. print cliente
  17. print direccion
  18.  
  19. cliente.close()
  20. servidor.close()

Nuestro objetivo es mantener la conexión hasta que ambas partes decidan cerrarla. Sólo es posible saber eso si primero realizamos un intercambio de información entre ambas partes. Es decir, el servidor nunca se enterará que el cliente desea cerrar la conexión, al menos que reciba un mensaje por parte de él (y viceversa).

Por suerte, el objeto socket posee dos métodos que nos permiten hacer esto de forma sencilla: send y recv.

Para ser fieles a nuestras costumbres, recurramos a la documentación oficial y veamos cómo funciona cada uno.

El método No tienes permisos para ver links. Registrate o Entra con tu cuenta, como su nombre lo indica, nos permite enviar información al socket al que estamos conectados (ya sea cliente o servidor). Su sintaxis es la siguiente:

Código: Python
  1. data = "mensaje"
  2. flags = 0
  3. socket.send(data, flags)

Como vemos, el método recibe dos argumentos:
    - data: es la información que queremos transmitir.
    - flags: este argumento, de tipo entero y opcional, nos permite establecer cómo queremos que se envíe la información. Su valor, por defecto, es cero. Podemos ver otros de sus posibles valores por No tienes permisos para ver links. Registrate o Entra con tu cuenta.

Al finalizar, nos devuelve el número de bytes que fueron enviados. Esto es importante por el hecho de que somos nosotros, por medio de nuestra aplicación, los que debemos llevar la cuenta de cuántos bytes hemos enviado y cuántos quedan por enviar.

Por último, también es importante saber que este método es bloqueante, es decir, la aplicación quedará detenida en este punto hasta que finalice el envío de información.

El método No tienes permisos para ver links. Registrate o Entra con tu cuenta es bastante similar al anterior y nos permite recibir la información enviada por el socket al que estamos conectados (ya sea cliente o servidor). Su sintaxis es la siguiente:

Código: Python
  1. bufsize = 1024
  2. flags = 0
  3. socket.recv(bufsize, flags)

Al igual que el método anterior, los argumentos que recibe son dos:
    - bufsize: es un entero que indica la cantidad máxima de datos que se recibirán por vez. Tal como se comenta en la documentación, se recomienda utilizar pequeñas potencias de 2 (por ejemplo, 1024, 2048 o 4096).
    - flags: este argumento, de tipo entero y opcional, nos permite establecer cómo queremos que se reciba la información (sí, es casi idéntico al argumento del método send). Su valor por defecto es cero pero podemos utilizar cualquiera de los flags que vemos por No tienes permisos para ver links. Registrate o Entra con tu cuenta.

Al finalizar, el método devuelve una dato de tipo str que corresponde al mensaje enviado por el otro extremo de la conexión.

De forma similar al anterior, este método es bloqueante. La aplicación se estancará en este punto hasta finalizar de recibir toda la información.

Muy bien. Ahora que ya sabemos como enviar y recibir información, es hora de codear un poco.

servidor.py
Código: Python
  1. # -*- coding: utf-8 -*-
  2. import socket
  3.  
  4. # creamos el socket del servidor
  5. servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  6.  
  7. # establecemos interfaz de conexión
  8. servidor.bind(("0.0.0.0", 2236))
  9.  
  10. # modo pasivo y backlog
  11. servidor.listen(5)
  12.  
  13. # aceptamos conexiones entrantes
  14. cliente, direccion = servidor.accept()
  15.  
  16. # enviamos un mensaje al cliente
  17. msj = "Bienvenido a UnderCh4t! Escribí '/desconectar' para salir."
  18. cliente.send(msj)
  19.  
  20. # creamos un bucle para recibir información enviada por el cliente
  21. while True:
  22.     # recibimos la información enviada por el cliente
  23.     recv = cliente.recv(1024)
  24.  
  25.     # formateamos la información
  26.     recv = recv.lower().strip()
  27.  
  28.     # verificamos si hay que finalizar la conexión
  29.     if recv == "/desconectar":
  30.         cliente.close()
  31.         break
  32.  
  33.     # imprimimos en pantalla la información recibida
  34.     print recv
  35.  
  36. # cerramos el servidor
  37. servidor.close()

Quiero dejar en claro que hay muchas cosas que estamos dejando de lado. Esto lo digo por varias cosas pero, principalmente, por los errores y el manejo de los mismos. Poco a poco iremos mejorando nuestro código. Por ahora, sólo me interesa transmitir, uno a uno, los conceptos que vamos tratando.

Para los que se están preguntando por la línea en la que formateamos la información, les recuerdo que recv es una variable de tipo str, por lo que lower y strip son dos de sus tantos métodos (más información por aquí: No tienes permisos para ver links. Registrate o Entra con tu cuenta - No tienes permisos para ver links. Registrate o Entra con tu cuenta).

Si ponemos en marcha nuestro nuevo servidor, veremos que hemos ganado un poco de funcionalidad. El servidor se quedará recibiendo mensajes del cliente hasta que éste le indique su intención de cerrar la conexión (enviando el mensaje "/desconectar").

Muy bien. Esto es todo por hoy. Hagan pruebas, jueguen y experimenten con su servidor. Paciencia que en algún momento nos meteremos con el cliente. Mientras tanto, pueden usar telnet o netcat (recomiendo este último).

Saludos y hasta la próxima!
WhiZ
« Última modificación: Enero 10, 2016, 09:53:48 am por WhiZ »


Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5380
  • Actividad:
    76.67%
  • Reputación 31
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« Respuesta #1 en: Enero 03, 2016, 09:40:39 pm »
Excelente Whiz!!! Sigue creciendo el pequeño monstruo!
Felicitaciones por el proyecto! Me gusta mucho verlo progresar!

Saludos!
ANTRAX


Desconectado Theraritho5

  • *
  • Underc0der
  • Mensajes: 26
  • Actividad:
    0%
  • Reputación -1
  • Curioso :(
    • Ver Perfil
  • Skype: Theraritho5
« Respuesta #2 en: Enero 04, 2016, 12:07:16 am »
Geniaaal, muy bien Whiz, esta genial

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« Respuesta #3 en: Enero 11, 2016, 07:14:15 pm »
Buen trabajo brother. Muy bien explicado. Espero la siguiente entrega.

Saludos!






No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado reigelado

  • *
  • Underc0der
  • Mensajes: 7
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Enero 11, 2016, 09:33:50 pm »
Muito bom o topico a lib sockets do python realmente é uma mão na roda.

 

¿Te gustó el post? COMPARTILO!



[Código] Yardas a metros - Metros a yardas [Python]

Iniciado por LucaSthefano

Respuestas: 0
Vistas: 1340
Último mensaje Mayo 29, 2011, 01:27:34 am
por LucaSthefano
Python Trojan - By "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 1
Vistas: 1970
Último mensaje Abril 03, 2010, 11:01:59 pm
por Dharok
Python phpmyadmin "BruteForce"

Iniciado por linkgl

Respuestas: 2
Vistas: 2439
Último mensaje Agosto 19, 2011, 12:14:37 pm
por linkgl
Python keylogger - by "bLiNdFiR3"

Iniciado por d33k40

Respuestas: 0
Vistas: 1962
Último mensaje Abril 07, 2010, 03:30:22 am
por d33k40
[Código] Entero / No Entero [Ejercicio - Python]

Iniciado por LucaSthefano

Respuestas: 0
Vistas: 1299
Último mensaje Mayo 29, 2011, 01:24:09 am
por LucaSthefano