WedX - журнал о программировании и компьютерных науках

Python: чтение данных из скрученного сокета в структуру SWIG

Я пишу клиент Python для подключения к серверу, написанному на C, который отправляет статус в двоичной структуре. Я обернул структуру C с помощью SWIG, но мне нужно обрабатывать данные, возвращаемые из сокета, как структуру C. В частности, я хочу преобразовать данные, переданные в dataReceived(), в виде структуры iwrf_ui_task_operations.

Нужно ли мне писать (и SWIG) вспомогательную функцию, которая передает «данные» и возвращает структуру iwrf_ui_task_operations?

Вот простая тестовая программа:

from twisted.internet import reactor, protocol
import syscon_interface


class SysconClient(protocol.Protocol):
    """Once connected, receive messages from syscon."""

    def connectionMade(self):
        print "connectionMade"

    def dataReceived(self, data):
        "As soon as any data is received, write it out."
        # this constructor does not accept 'data' as an argument  :-(
        to = syscon_interface.iwrf_ui_task_operations_t()  
        print "Server said:", data

    def connectionLost(self, reason):
        print "connection lost"

class SysconClientFactory(protocol.ClientFactory):
    protocol = SysconClient

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "Connection lost - goodbye!"
        reactor.stop()


# this connects the protocol to a server running on port 2515
def main():
    f = SysconClientFactory()
    reactor.connectTCP("localhost", 2515, f)
    reactor.run()

# this only runs if the module was *not* imported
if __name__ == '__main__':
    main()       
08.08.2014

Ответы:


1

Вы не хотите этого делать. Данные, переданные dataReceived, представляют собой сегмент TCP, а не протокольное сообщение. Таким образом, вы можете получить часть своей структуры, или всю ее, или несколько, или данные, которые начинаются в середине одной.

См. эти вопросы и ответы по Twisted.

Кроме того, вы не хотите делать это вообще. Различные компиляторы C могут абсолютно корректно генерировать разные макеты для этой структуры, и будет задействован порядок байтов вашей платформы, и это, как правило, плохая сцена.

Если вы собираетесь это сделать (и, исходя из формулировки вашего вопроса, я предполагаю, что вы должны это сделать), сначала вам нужно убедиться, что ваши точные версии цепочки инструментов (версия компилятора C, версия SWIG, версия Python, сборка Python опции и так далее) все точно синхронизированы. Затем вам нужно написать протокол кадрирования, как в twisted.protocols.basic. , которая работает с записями фиксированной ширины на основе sizeof(iwrf_ui_task_operations_t), а затем, когда вы разделите это, логическим следующим шагом будет функция-оболочка, которая принимает char* data и int length и создает вашу структуру.

Наконец, не используйте SWIG, используйте CFFI. Значительно проще писать привязки, они более переносимы на другие среды выполнения (например, PyPy может выполнять JIT ваши вызовы в C) и значительно безопаснее (гораздо меньше вероятность segfault).

08.08.2014
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]