#!/bin/env python

import socket, select, sys

HOST = ''
PORT = 9999

client_fd = []
fd_to_conn = {}

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_fd = s.fileno()
client_fd.append(listen_fd)
s.bind((HOST, PORT))
s.listen(100)
s.settimeout(5)

while True:
    r_fds, w_fds, e_fds = select.select(client_fd, [], [])
    for fd in r_fds:
        if fd == listen_fd:
            conn, addr = s.accept()
            print 'Accepted connection from %s:%d [fd: %d]' % (addr[0], addr[1], conn.fileno())
            fd_to_conn[conn.fileno()] = conn
            client_fd.append(conn.fileno())
        else:
            data = fd_to_conn[fd].recv(1024)
            if not data:
                # closed connection
                print 'Goodbye'
                fd_to_conn[fd].close()
                del(fd_to_conn[fd])
                client_fd.pop(client_fd.index(fd))
            else:
                fd_to_conn[fd].send(data)



