class SocketMessagePipe(MessagePipe): STATE_HEADER = 0 STATE_MESSAGE = 1 message_match = re.compile('^MESSAGE BYTES (\d+)$') def __init__(self, sock): MessagePipe.__init__(self) self.sock = sock ## message recieve state information self.message_length = 0 self.state = self.STATE_HEADER ## send and recieve buffers self.recv_len = 0 self.recv_buff = [""] self.send_pos = 0 self.send_buff = '' ## add socket to network engine self.sock.setblocking(0) mainloop.add_read_cb(self.sock, self.P_sock_read_cb, None) def send(self, message): ## add message to send buffer self.send_buff = self.send_buff[self.send_pos:] + self.P_encode( message) self.send_pos = 0 ## sanity check if not len(self.send_buff): return try: send_len = self.sock.send(self.send_buff) except socket.error, (err_number, err_string): print 'socket.error: %s %d' % (err_string, err_number) self.close() return ## zero bytes written is EOF, socket is closed if not send_len: self.close() return ## wrote the whole buffer if send_len == len(self.send_buff): self.send_buff = '' mainloop.remove_write_cb(self.sock) return ## schedule a write-ready callback to write the rest of the data if send_len < len(self.send_buff): self.send_buff = self.send_buff[send_len:] mainloop.add_write_cb(self.sock, self.P_sock_write_cb) return
def close(self): mainloop.remove_read_cb(self.sock) mainloop.remove_write_cb(self.sock) self.call_close_cb()
send_len = self.sock.send(self.send_buff[self.send_pos:self.send_pos+8192]) except socket.error, (err_number, err_string): print 'socket.error: %s %d' % (err_string, err_number) self.close() return ## zero bytes written is EOF, socket is closed if not send_len: self.close() return ## wrote the whole buffer if send_len + self.send_pos == len(self.send_buff): self.send_buff = '' self.send_pos = 0 mainloop.remove_write_cb(self.sock) else: self.send_pos = self.send_pos + send_len return def P_sock_read_cb(self, sock): try: buff = self.sock.recv(8192) except socket.error: self.close() return ## check for socket EOF if not buff: self.close()
self.send_buff[self.send_pos:self.send_pos + 8192]) except socket.error, (err_number, err_string): print 'socket.error: %s %d' % (err_string, err_number) self.close() return ## zero bytes written is EOF, socket is closed if not send_len: self.close() return ## wrote the whole buffer if send_len + self.send_pos == len(self.send_buff): self.send_buff = '' self.send_pos = 0 mainloop.remove_write_cb(self.sock) else: self.send_pos = self.send_pos + send_len return def P_sock_read_cb(self, sock): try: buff = self.sock.recv(8192) except socket.error: self.close() return ## check for socket EOF if not buff: self.close() return