En una de las prácticas de la asignatura de Sistemas Distribuidos, y para que tengan varias opciones a la hora de programar un pequeño programa que les pedimos y que debe seguir la arquitectura cliente-servidor, les dejaré el esqueleto en python y C de ambos procesos.
En muchos sitios, he encontrado un código similar a éste (para el servidor):
#!/usr/bin/python #encoding:utf-8 try: import socket,sys,optparse except: print("Error running 'import socket,sys,optparse'. Maybe you have to install some python library") parser = optparse.OptionParser("usage%prog " + "-d <ip> -p <target port>") parser.add_option('-d', dest = 'ip', type = 'string', help = 'Please, specify the target server') parser.add_option('-p', dest = 'port', type = 'string', help = 'Please, specify the target port') (options, args) = parser.parse_args() if (options.ip == None): print '[-] You must specify a ip direction to listen to.' exit(0) if (options.port == None): print '[-] You must specify a port.' exit(0) HOST=options.ip PORT=int(options.port) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket created' try: s.bind((HOST, PORT)) except socket.error , msg: print 'Bind failed. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1] sys.exit() print 'Socket bind complete' s.listen(1) print 'Socket now listening' conn, addr = s.accept() print 'Connected with ' + addr[0] + ':' + str(addr[1]) while True: #receive data data = conn.recv(1024) #process data if not data: break #elif re.match(data, "QUITn."): elif data == "QUITn": reply = 'BYE' conn.send(reply) #send reply break else: print 'Received data: ' + data + " from " + addr[0] + ':' + str(addr[1]) reply = 'OK...' + data conn.send(reply) #send reply conn.close() s.close()
Creo que se explica solo. Podemos probarlo, aunque no tengamos implementado el cliente, con el comando nc tal y como se muestra en la imagen (o también telnet localhost 6666).
Solo admite un cliente y, cuando termina la conexión, acaba. Si pusiéramos un ‘while True:’ más, justo antes del accept, al terminar un cliente, podría aceptar más, pero siempre secuencial, un cliente tras otro. ¿Cómo podemos mejorarlo para que acepte conexiones concurrentes? Utilizando procesos o hilos.
En la siguiente entrada, pongo el código de ejemplo.
Referencias:
- Python para todos, de Raúl González Duque