Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 def close(self):
     mainloop.remove_read_cb(self.sock)
     mainloop.remove_write_cb(self.sock)
     self.call_close_cb()
Ejemplo n.º 3
0
            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()
Ejemplo n.º 4
0
 def close(self):
     mainloop.remove_read_cb(self.sock)
     mainloop.remove_write_cb(self.sock)
     self.call_close_cb()
Ejemplo n.º 5
0
                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