? ?
 

TCP говнокод(2). Ускоряем!

About Уничтожить всех уродов

Previous Entry TCP говнокод(2). Ускоряем! 1 авг, 2015 @ 15:17 Next Entry
Переписал автомат, выкинув проверку waitForReadyRead (из-за которой время от времени и непредсказуемо случалась ошибка SocketTimeoutError). Теперь вход в автомат возможен из двух разных функций: при получении сигнала от, например, кнопки -- когда пользователь хочет получить данные от устройства -- и от сокета (readyRead). Сначала автомат шлёт запрос в устройство, запоминает состояние и выходит. Потом срабатывает сокет и снова запускается автомат: он смотрит, в каком состоянии был, размышляет о том, что надо сделать дальше и либо выдаёт уже свой сигнал готовности данных чтения (или завершения операции записи, если мнеэто понадобится когда-нибудь), либо идёт по циклу состояний.

Получение данных из сокета теперь работает не с одиночными байтами, а с доступным объёмом. Не знаю, правда, как проверить работоспособность алгоритма, если данных пришло меньше, чем надо. Теоретически, пока не придёт "минимальный квант", функция приёма просто будет завершаться, ничего не делая. Тут уже зависит от того, как на самом деле генерится сигнал readyRead. Если он может выскакивать, даже если пришёл всего один байт,... а потом ещё один байт (и снова срабатывание сигнала)... и ещё один.. или два.. тогда должно работать норм. Если же это не так, то х.з.
Оставить комментарий
[User Picture Icon]
From:metaclass
Date:Август, 1, 2015 16:35 (UTC)
(Link)
Чтобы проверить, можно использовать nc с вводом из stdin. Там каждая нажатая буква будет отдельным пакетом.
Ну или вообще написать tcp клиент простейший с TCP_NODELAY и там вызывать по частям write/sleep/write/sleep.
[User Picture Icon]
From:kincajou
Date:Август, 1, 2015 17:27 (UTC)
(Link)
и вообще у меня появилось какое-то подозрение, что нужно ДВА автомата - один формирует передачи, другой посылки.. но, с другой стороны, когда всё в одном месте сконцентрировано, как-то проще следить за кодом
[User Picture Icon]
From:kincajou
Date:Август, 2, 2015 03:28 (UTC)
(Link)
работает вроде...
и, главное, позволило мне нахреначить ещё писят килобайт говнокода, основанного на этой механике - команды там, то-сё. Меня бесит, когда в коде есть.. хмм.. некая несимметричность, что ли. Когда разные команды протокола надо обрабатывать разными способами (например, когда получаем список одних параметров - сначала шлём список ключей... а для второго списка шлём просто запросы на получение каждой следующей записи), но не могу придумать никаких способов обхода.

Ну и пофиг. Работает!
[User Picture Icon]
From:metaclass
Date:Август, 2, 2015 08:25 (UTC)
(Link)
А, с протоколами это вечная боль, лучше даже не пытаться решать, потому что кончится изобретением DSL описания протоколов поверх лиспа и генерацией из него кода на чем попало, я проверял :)
(Оставить комментарий)
Top of Page Разработано LiveJournal.com