| 223 | # TCP Client |
| 224 | ######################################################################################################################## |
| 225 | class TCPConnection(asyncore.dispatcher): |
| 226 | STATE_ERROR = -1 |
| 227 | STATE_IDLE = 0 |
| 228 | STATE_RESOLVING = 1 |
| 229 | STATE_CONNECTING = 2 |
| 230 | STATE_CONNECTED = 3 |
| 231 | |
| 232 | def __init__(self, client_id): |
| 233 | global options |
| 234 | asyncore.dispatcher.__init__(self) |
| 235 | self.client_id = client_id |
| 236 | self.state = self.STATE_IDLE |
| 237 | self.buffer = '' |
| 238 | self.addr = None |
| 239 | self.dns_thread = None |
| 240 | self.hostname = None |
| 241 | self.port = None |
| 242 | self.needs_config = True |
| 243 | self.needs_close = False |
| 244 | self.did_resolve = False |
| 245 | |
| 246 | def SendMessage(self, type, message): |
| 247 | message['message'] = type |
| 248 | message['connection'] = self.client_id |
| 249 | in_pipe.SendMessage(message) |
| 250 | |
| 251 | def handle_message(self, message): |
| 252 | if message['message'] == 'data' and 'data' in message and len(message['data']): |
| 253 | self.buffer += message['data'] |
| 254 | if self.state == self.STATE_CONNECTED: |
| 255 | self.handle_write() |
| 256 | elif message['message'] == 'resolve': |
| 257 | self.HandleResolve(message) |
| 258 | elif message['message'] == 'connect': |
| 259 | self.HandleConnect(message) |
| 260 | elif message['message'] == 'closed': |
| 261 | if len(self.buffer) == 0: |
| 262 | self.handle_close() |
| 263 | else: |
| 264 | self.needs_close = True |
| 265 | |
| 266 | def handle_error(self): |
| 267 | logging.warning('[{0:d}] Error'.format(self.client_id)) |
| 268 | if self.state == self.STATE_CONNECTING: |
| 269 | self.SendMessage('connected', {'success': False, 'address': self.addr}) |
| 270 | |
| 271 | def handle_close(self): |
| 272 | global last_client_disconnected |
| 273 | logging.info('[{0:d}] Server Connection Closed'.format(self.client_id)) |
| 274 | self.state = self.STATE_ERROR |
| 275 | self.close() |
| 276 | try: |
| 277 | if self.client_id in connections: |
| 278 | if 'server' in connections[self.client_id]: |
| 279 | del connections[self.client_id]['server'] |
| 280 | if 'client' in connections[self.client_id]: |
| 281 | self.SendMessage('closed', {}) |
| 282 | else: |