jueves, 16 de agosto de 2012

Sockets, creando un cliente e un servidor (Python)

Boas a todxs,

Hoxe imos falar de comunicacións, concretamente grazas a ese conceito astracto co que se designa ao punto final dunha conexión ao clásico conceito de socket e concretamente explificaremos a súa utilidade con Python.

Para que se utilizan os sockets? Para comunicarse con outros programas no mesmo ou noutro PC.

Os sockets defínense por IP, porto e protocolo. En python, concretamente hai unha librería para isto coa que podemos crear un obxeto "socket":

socket = socket.socket()

Existen sockets de fluxo (socket.SOCK_STREAM) ou sockets de datagramas (socket.SOCK_DGRAM) dependendo de se o servizo emprega TCP ou UDP respeitivamente. Na gran maioría de utilidades nas que podemos pensar chéganos cos sockets de fluxo.

Tamén se pode especificar o tipo de familia, pero non entraremos no tema, fariase deste xeito (O seguinte exemplo sería o default, e dicer, o standar e que se supón ao non especificar o tipo de socket nin a familia):

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Que mellor forma de ver a súa utilidade que grazas a un pequeno exemplo con comentarios?

Fagamos a parte final dun wargame, creemos unha comunicación entre un arquivo cliente e un arquivo servidor, fagamos que ao enviar unhas determinadas palabras ou mensaxes desencriptadas dun documento anterior a unha dirección que aparece no mesmo, recibamos unha resposta X que sexa o contrasinal para pasar á seguinte proba. Pois sería algo así:

#servidor

#!/usr/bin/env python
#Hackliza! server
 
import socket #importamos a libreria socket 
 
#creamos o obxecto socket e pomos a escoitar en localhost porto 6666 
s = socket.socket() 
s.bind(("localhost", 6666)) 
s.listen(1)
 
#cando chega unha mesaxe (datos), establecemos a conexion 
sc, addr = s.accept() 
 
#Mentras estexa establecida a conexion recibimos a informacion e en funcion
#ao recibido enviamos unha resposta 
while True: 
      recibido = sc.recv(1024)
      print "",recibido  
      if recibido == "quit":
         print "\n"
         sc.send("Sorte nos seguintes retos") 
         break
      if recibido == "hackingtheworld": 
         print "Enviando solucion...\n"
         sc.send("O resultado e: Hackliza!")  
      print "Non superado\n" 
      sc.send("Segue intentadoo...") 
   
print "Apagando servidor" 
 
#pechamos a conexion e a continuacion o servidor ao recibir "quit" 
sc.close() 
s.close()

#cliente

#!usr/bin/env python
#Hacliza! cliente
 
import socket
 
#creamos o obxeto socket e conectamonos a localhost e porto 6666 
s = socket.socket() 
s.connect(("localhost", 6666))
 
#mentras non escribamos quit poderemos introducir unha mesaxe para ver o resultado 
while True: 
      password = raw_input("[+]Que queres saber? > ") 
      s.send(password)
      recibido = s.recv(1024) 
      if password == "quit":
         print "",recibido 
         break
         exit()
      print "",recibido
 
#ao sair mediante "quit" pechase o cliente 
s.close()

No hay comentarios:

Publicar un comentario