1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import asyncore
24 import socket
25 import struct
26 import time
27 import StringIO
28
29 import Log
30
31 PORT = 12345
32
35 dict.__init__(self)
36 self.idCounter = -1
37 self.objMap = {}
38
39 - def add(self, object, id = None):
43
44 - def id(self, object):
45 try:
46 return self.objMap[object]
47 except KeyError:
48 pass
49
51 try:
52 del self.objMap[self[id]]
53 del self[id]
54 except KeyError:
55 pass
56
60
62 self.idCounter += 1
63 return self.idCounter
64
67 asyncore.dispatcher.__init__(self, sock = sock)
68 self.id = None
69 self.server = None
70 self._buffer = []
71 self._sentSizeField = False
72 self._receivedSizeField = 0
73 self._packet = StringIO.StringIO()
74
75 if not sock:
76 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
77
78
79
80
81
83 assert self.id is None
84
85 asyncore.dispatcher.connect(self, (host, port))
86
87
88 n = 0
89 while not self.connected and n < 600:
90 communicate()
91 n += 1
92 if n > 100:
93 time.sleep(.1)
94
101
104
107
110
112 try:
113 if not self._receivedSizeField:
114 data = self.recv(2)
115 if data:
116 self._receivedSizeField = struct.unpack("H", data)[0]
117 return
118 data = self.recv(self._receivedSizeField)
119 if data:
120 self._receivedSizeField -= len(data)
121 self._packet.write(data)
122 if not self._receivedSizeField:
123
124 if self.id is None:
125 self.id = struct.unpack("H", self._packet.getvalue())[0]
126 self.handleRegistration()
127 else:
128 self.handlePacket(self._packet.getvalue())
129 self._packet.truncate()
130 self._packet.seek(0)
131 except socket.error, e:
132 Log.error("Socket error while receiving: %s" % str(e))
133
135 return len(self._buffer) > 0
136
138 self._buffer.append(packet)
139
142
146
151
154
157
159 try:
160 data = self._buffer[0]
161 if not self._sentSizeField:
162 self.send(struct.pack("H", len(data)))
163 self._sentSizeField = True
164 sent = self.send(data)
165 data = data[sent:]
166 if data:
167 self._buffer[0] = data
168 else:
169 self._buffer = self._buffer[1:]
170 self._sentSizeField = False
171 except socket.error, e:
172 Log.error("Socket error while sending: %s" % str(e))
173
174 -class Server(asyncore.dispatcher):
176 asyncore.dispatcher.__init__(self)
177 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
178 self.set_reuse_addr()
179 self.bind((localOnly and "localhost" or "", port))
180 self.listen(5)
181 self.clients = {}
182 self.__idCounter = 0
183
192
195
198
202
204 for c in self.clients.values():
205 c.close()
206
209
211 if connection.id in self.clients:
212 del self.clients[connection.id]
213
215 for c in self.clients.values():
216 if not c.id in ignore:
217 c.sendPacket(packet)
218 if meToo:
219 self.clients.values()[0].handlePacket(packet)
220
223
225 while cycles:
226 asyncore.poll(0, asyncore.socket_map)
227 cycles -= 1
228
231