import socket, select

def chan_service(sock, sockmap):
    sock.send('Hello!\n')
    print " + Sent Hello"
    yield None

    v = 0
    for l in iter(lambda:sock.recv(8192), ''):
        v += int(l.strip())
        sock.send('>> %d\n' % v)
        yield None

    sock.close()

def chan_accept(listensock, sockmap):
    while True:
        sock, addr = listensock.accept()
        print "Accepted from", addr
        ch = sockmap[sock.fileno()] = chan_service(sock, sockmap)
        ch.next()
        yield None


if __name__ == '__main__':
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', 6942))
    s.listen(5)
    sockmap = {}
    sockmap[s.fileno()] = chan_accept(s, sockmap)
    try:
        while True:
            rfds, wfds, xl = select.select(sockmap.keys(), [], [])
            for fd in rfds:
                try:
                    sockmap[fd].next()
                except StopIteration:
                    del sockmap[fd]
    finally:
        s.close()

