def poll_datagram(self): """Reads a datagram from the socket and returns it. If a datagram can't be read completely, it's readable data will be cached and None will be returned. If the connection has been closed, EOFError will be raised.""" self.read() # Did we just finish reading the message length? if (not self.reading_message) and (self.remaining_length == 0): length = struct.unpack('<H', self.partial_data)[0] self.partial_data = '' self.remaining_length = length self.reading_message = True self.read() # If either the initial read or the read at the end of the # block above finished reading a message body, then this # happens: if self.reading_message and (self.remaining_length == 0): dg = Datagram() dg.add_data(self.partial_data) self.partial_data = '' self.remaining_length = DATAGRAM_HEADER_SIZE self.reading_message = False return dg # So we did not actually finish reading a message at all. :( return
def recv_datagram(self): """Wait for the next datagram and return it.""" length = struct.unpack('<H', self._read(2))[0] data = self._read(length) dg = Datagram() dg.add_data(data) return dg
def poll_datagram(self): self.socket.setblocking(0) try: length = struct.unpack('<H', self._read(2))[0] except socket.error as err: if err.errno is errno.EWOULDBLOCK: return None else: raise err self.socket.setblocking(1) data = self._read(length) dg = Datagram() dg.add_data(data) return dg