def main():
    args = aux.parse_args("Echo server with threaded-processing model.")
    server_socket = aux.listening_socket(args.port)

    while True:
        client_socket, client_addr = server_socket.accept()

        worker = Worker(client_socket)
        worker.start()
def main():
    args = aux.parse_args('Echo server with epoll-processing model.')
    server_socket = aux.listening_socket(args.port)
    server_fileno = server_socket.fileno()

    fileno_to_data = {}
    fileno_to_socket = {}

    read_epoll = select.epoll()
    read_epoll.register(server_fileno, select.EPOLLIN)

    while True:
        for fileno, eventmask in read_epoll.poll(0.05):
            if fileno == server_fileno:
                client_socket, _ = server_socket.accept()
                client_fileno = client_socket.fileno()

                fileno_to_data[client_fileno] = ''
                fileno_to_socket[client_fileno] = client_socket

                read_epoll.register(client_fileno, select.EPOLLIN)
            else:
                client_socket = fileno_to_socket[fileno]

                data = client_socket.recv(1024)
                if not data:
                    read_epoll.unregister(fileno)
                    del fileno_to_data[fileno]
                    del fileno_to_socket[fileno]
                    client_socket.close()
                else:
                    fileno_to_data[fileno] += data

        check_writability = [f for f, d in fileno_to_data.iteritems() if d]
        if not check_writability:
            continue

        write_epoll = select.epoll()
        for fileno in check_writability:
            write_epoll.register(fileno, select.EPOLLOUT)

        for fileno, eventmask in write_epoll.poll(0.05):
            if eventmask & (select.EPOLLERR | select.EPOLLHUP):
                read_epoll.unregister(fileno)
                fileno_to_socket[fileno].close()
                del fileno_to_data[fileno]
                del fileno_to_socket[fileno]
                continue

            client_socket = fileno_to_socket[fileno]
            data = fileno_to_data[fileno]

            n = client_socket.send(data)
            if n > 0:
                fileno_to_data[fileno] = data[n:]

        write_epoll.close()
def main():
    args = aux.parse_args('Echo server with fork processing model.')
    server_socket = aux.listening_socket(args.port)

    signal.signal(signal.SIGCHLD, signal.SIG_IGN)

    while True:
        client_socket, client_addr = server_socket.accept()

        if os.fork() == 0:
            server_socket.close()
            aux.communicate(client_socket)
            client_socket.close()
            return
        else:
            client_socket.close()
def main():
    args = aux.parse_args('Echo server with select-processing model.')
    server_socket = aux.listening_socket(args.port)

    socket_to_data = {}
    client_sockets = []
    all_sockets = [server_socket]

    while True:
        readable, _, _ = select.select(all_sockets, [], [], 0.05)

        if server_socket in readable:
            client_socket, _ = server_socket.accept()

            socket_to_data[client_socket] = ''
            client_sockets.append(client_socket)
            all_sockets.append(client_socket)

            readable.remove(server_socket)

        for client_socket in readable:
            data = client_socket.recv(1024)
            if not data:
                del socket_to_data[client_socket]
                client_sockets.remove(client_socket)
                all_sockets.remove(client_socket)
                client_socket.close()
            else:
                socket_to_data[client_socket] += data

        check_writability = [cs for cs in client_sockets
                             if socket_to_data[cs]]

        _, writable, _ = select.select([], check_writability, [], 0.05)

        for client_socket in writable:
            data = socket_to_data[client_socket]
            n = client_socket.send(data)
            if n > 0:
                socket_to_data[client_socket] = data[n:]