#c #multithreading #tcp #dllimport
#c #многопоточность #tcp #dllimport
Вопрос:
У меня 10 000 устройств, и я хочу управлять ими с помощью одного приложения на c . Устройства являются серверными, и я могу управлять ими только с помощью dll. Библиотека Dll написана для MFC, и она была написана не мной, поэтому я ничего не могу с ней поделать.
Библиотека Dll устанавливает связь TCP / IP между устройствами и моим приложением.Каждое устройство имеет разные переменные. Мне нужно открывать новый поток для каждого входящего соединения и загружать экземпляр моей библиотеки dll. Я не смог загрузить разные экземпляры библиотеки dll для каждого потока. каждый раз используется одна и та же библиотека dll и одни и те же данные.
Как можно загрузить несколько экземпляров библиотеки dll? Есть ли какой-либо способ сделать это с c . Заранее спасибо
Комментарии:
1. У вас есть 10 000 устройств, и позвольте мне прояснить, вам нужен новый поток для каждого входящего соединения, я полагаю, вы понимаете, что нет способа установить входящее соединение со всеми 10 000 устройствами, верно?
2. @Gizde — Вам нужно опубликовать код.
Ответ №1:
Если данные являются статическими, невозможно иметь больше экземпляров в том же процессе. Вы должны модифицировать библиотеку dll, чтобы иметь какие-то данные для каждого контекста (обычно для этого подходит экземпляр класса). В любом случае, в качестве общего предложения, никогда не запускайте до 10000 потоков в процессе, это снизит производительность. Напишите пул потоков и позвольте управлять клиентом, обслуживаемым этим пулом.
Ответ №2:
Ваша ситуация не кажется обнадеживающей.
Windows никогда не будет загружать более одного экземпляра библиотеки DLL в рамках данного процесса. Если сама библиотека DLL не обладает функциональностью для подключения к нескольким серверам, вам придется создать отдельный процесс для каждого сервера, к которому вам нужно подключиться. На практике это было бы плохой идеей.
Вы могли бы использовать LoadLibrary () и UnloadLibrary() для многократного «перезапуска» библиотеки DLL и таким образом лихорадочно переключаться между разными серверами. Что-то вроде LoadLibrary() … путаница с сервером… Выгрузите библиотеку () … сделайте это снова и в той же ситуации. Это было бы болезненно и медленно, но могло бы сработать для вас.
Ответ №3:
Единственный (некрасивый) способ загружать библиотеку dll несколько раз — это при каждой новой загрузке создавать копию исходной библиотеки dll с уникальным именем в месте, которое вы контролируете.
Загрузите копию с помощью LoadLibrary
и настройте соответствующие указатели функций ( GetProcAddress(...)
) на функции во вновь загруженной библиотеке dll для использования в вашей программе.
После того, как вы закончите с этим, выгрузите копию с помощью FreeLibrary
и удалите копию с диска.
Ответ №4:
Я не вижу простого решения этой проблемы, как уже говорилось ранее, вы не можете создать несколько экземпляров библиотеки DLL в приложении.
Может быть ужасное решение, которое заключается в написании облегченного прокси для прослушивания входящих запросов и порождения нового экземпляра реального приложения при каждом запросе и пересылки трафика на него — должен быть способ загружать новую копию библиотеки DLL в каждом экземпляре (технически вы будете повторно открывать ту же загруженную библиотеку DLL, но в ней должны быть отдельные пространства данных).
Однако с устройствами 10k производительность будет ужасной. Похоже, что лучшим решением является либо повторная реализация протокола (либо использование опубликованной спецификации, либо обратное проектирование).