コード例 #1
0
    def _listen(self):
        """(internal) Busy loop to listen for events.

        This method is called in a thread by the `listen` method, and
        will be the one actually listening for messages on the server's
        sockets, and calling the callbacks when messages are received.
        """
        match = self._match_address
        advanced_matching = self.advanced_matching
        addresses = self.addresses
        stats = self.stats_received

        while True:
            drop_late = self.drop_late_bundles
            if not self.sockets:
                sleep(.01)
                continue
            else:
                try:
                    read, write, error = select(self.sockets, [], [],
                                                self.timeout)
                except (ValueError, socket.error):
                    continue

            for sender_socket in read:
                data, sender = sender_socket.recvfrom(65535)
                for address, tags, values, offset in read_packet(
                        data,
                        drop_late=drop_late,
                        encoding=self.encoding,
                        encoding_errors=self.encoding_errors):
                    stats.calls += 1
                    stats.bytes += offset
                    stats.params += len(values)
                    stats.types.update(tags)

                    matched = False
                    if advanced_matching:
                        for sock, addr in addresses:
                            if sock == sender_socket and match(addr, address):
                                matched = True
                                for cb, get_address in addresses[(sock, addr)]:
                                    if get_address:
                                        cb(address, *values)
                                    else:
                                        cb(*values)

                    else:
                        if (sender_socket, address) in addresses:
                            matched = True

                        for cb, get_address in addresses.get(
                            (sender_socket, address), []):
                            if get_address:
                                cb(address, *values)
                            else:
                                cb(*values)

                    if not matched and self.default_handler:
                        self.default_handler(address, *values)
コード例 #2
0
    def _listen(self):
        """(internal) Busy loop to listen for events.

        This method is called in a thread by the `listen` method, and
        will be the one actually listening for messages on the server's
        sockets, and calling the callbacks when messages are received.
        """

        match = self._match_address
        advanced_matching = self.advanced_matching
        addresses = self.addresses
        stats = self.stats_received

        def _execute_callbacks(_callbacks_list):
            for cb, get_address in _callbacks_list:
                try:
                    if get_address:
                        cb(address, *values)
                    else:
                        cb(*values)
                except Exception as exc:
                    if self.intercept_errors:
                        logger.error(
                            "Unhandled exception caught in oscpy server",
                            exc_info=True)
                    else:
                        raise

        while self._must_loop:

            drop_late = self.drop_late_bundles
            if not self.sockets:
                sleep(.01)
                continue
            else:
                try:
                    read, write, error = select(self.sockets, [], [],
                                                self.timeout)
                except (ValueError, socket.error):
                    continue

            for sender_socket in read:
                try:
                    data, sender = sender_socket.recvfrom(65535)
                except ConnectionResetError:
                    continue

                for address, tags, values, offset in read_packet(
                        data,
                        drop_late=drop_late,
                        encoding=self.encoding,
                        encoding_errors=self.encoding_errors):
                    stats.calls += 1
                    stats.bytes += offset
                    stats.params += len(values)
                    stats.types.update(tags)

                    matched = False
                    if advanced_matching:
                        for sock, addr in addresses:
                            if sock == sender_socket and match(addr, address):
                                callbacks_list = addresses.get((sock, addr),
                                                               [])
                                if callbacks_list:
                                    matched = True
                                    _execute_callbacks(callbacks_list)
                    else:
                        callbacks_list = addresses.get(
                            (sender_socket, address), [])
                        if callbacks_list:
                            matched = True
                            _execute_callbacks(callbacks_list)

                    if not matched and self.default_handler:
                        self.default_handler(address, *values)
コード例 #3
0
ファイル: test_parser.py プロジェクト: trrnt/oscpy
def test_read_packet():
    with raises(ValueError):
        read_packet(struct.pack('>%is' % len('test'), b'test'))