Вы хотите создать некую архитектуру клиент-сервер, которая также называется IPC.
Использование WM_COPYDATA
- очень хорошая идея. Я обнаружил, что это очень быстро, легко и эффективно на локальной машине. И он может быть передан по системе всем приложениям одновременно (для осторожного использования, если какое-либо приложение не обрабатывает его правильно).
Вы также можете разделить некоторую память, используя файлы с отображенной памятью. Это может быть самый быстрый вариант IPC для огромного количества данных, но синхронизация немного сложна (если вы хотите использовать более одного буфера одновременно).
Именованные каналы являются хорошими кандидатами для местных. Их, как правило, сложно реализовать / настроить по сети из-за проблем безопасности в современных версиях Windows (и они используют TCP / IP для сетевого взаимодействия, поэтому вместо них лучше использовать напрямую TCP / IP).
Мой личный совет заключается в том, что вы должны реализовать обмен данными с абстрактными классами, способными обеспечить несколько реализаций. Вы можете сначала использовать WM_COPYDATA
, а затем переключиться на именованные каналы, TCP / IP или HTTP, чтобы распространить свое приложение по сети.
Для нашего открытого клиент-серверного ORM мы реализовали несколько протоколов , включая WM_COPY_DATA
, именованный канал, HTTP или прямой внутрипроцессный доступ. Вы можете взглянуть на исходный код, предоставленный для шаблонов реализации. Вот некоторые тесты, чтобы дать вам данные из реальных реализаций:
Client server access:
- Http client keep alive: 3001 assertions passed
first in 7.87ms, done in 153.37ms i.e. 6520/s, average 153us
- Http client multi connect: 3001 assertions passed
first in 151us, done in 305.98ms i.e. 3268/s, average 305us
- Named pipe access: 3003 assertions passed
first in 78.67ms, done in 187.15ms i.e. 5343/s, average 187us
- Local window messages: 3002 assertions passed
first in 148us, done in 112.90ms i.e. 8857/s, average 112us
- Direct in process access: 3001 assertions passed
first in 44us, done in 41.69ms i.e. 23981/s, average 41us
Total failed: 0 / 15014 - Client server access PASSED
Как видите, наиболее быстрым является прямой доступ, затем WM_COPY_DATA
, затем именованные каналы, затем HTTP (т. Е. TCP / IP). Сообщение содержало около 5 КБ данных JSON, содержащих 113 строк, полученных с сервера, а затем проанализированных на клиенте 100 раз (да, наша структура работает быстро :)). Для огромных блоков данных (например, 4 МБ) WM_COPY_DATA
медленнее, чем именованные каналы или HTTP-TCP / IP.