root/livinglogic.python.tipimaid/liaalh_server.py @ 49:6ce0aee574f5

Revision 49:6ce0aee574f5, 1.3 KB (checked in by Nikolas Tautenhahn <nik@…>, 11 years ago)

proper handling of lost connections

Line 
1import sys, socket, select
2
3port = 40000
4backlog = 5
5size = 8192
6input = []
7sockets = []
8for (af, socktype, proto, canonname, sa) in socket.getaddrinfo(None, port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
9    try:
10        s = socket.socket(af, socktype, proto)
11    except socket.error, msg:
12        s = None
13        continue
14    try:
15        s.setblocking(0)
16        s.bind(sa)
17        s.listen(backlog)
18        sockets.append(s)
19    except socket.error, msg:
20        s.close()
21        s = None
22        continue
23
24input = sockets[:]
25inputs = {}
26
27while True:
28    (inputready, outputready, exceptready) = select.select(input, [], [], 60)
29    for s in inputready:
30        if s in sockets:
31            # handle the server sockets
32            client, address = s.accept()
33            input.append(client)
34            inputs[client] = ""
35        else:
36            # handle all other sockets
37            try:
38                data = s.recv(size)
39            except socket.error, exc:
40                s.close()
41                del inputs[s]
42                input.remove(s) # TODO: make sure that we don't create index errors here
43                continue
44            if data:
45                s.send("1") # notify the sender that we got something DISABLE THIS IF WE USE NETCAT AS SENDER!
46                inputs[s] += data
47                pos = inputs[s].rfind("\n")
48                if pos >= 0:
49                    sys.stdout.write(inputs[s][:pos+1])
50                    sys.stdout.flush()
51                    inputs[s] = inputs[s][pos+1:]
52            else:
53                s.close()
54                del inputs[s]
55                input.remove(s)
Note: See TracBrowser for help on using the browser.