CreateProcess() в клиент-серверном приложении в windows
Я работаю над клиент-серверным приложением UDP, где один сервер должен обрабатывать 40 клиентов, и все они могут быть зарегистрированы одновременно.
Теперь в UNIX такие проблемы решаются с помощью fork
функция, которая в основном создает дочерний процесс для взаимодействия с клиентом и оставляет сервер для принятия новых соединений.
Я искал в интернете и обнаружил, что fork
однако недоступен в Windows CreateProcess
может быть использован.
Мои предыдущие исследования также познакомили меня с пулами потоков. Итак, теперь у меня есть два вопроса:
- Могу ли я достичь функциональности
fork()
используяCreateProcess()
в винде? - Если это возможно, что я должен пойти: пулы потоков или создание нескольких процессов?
2 ответа
В linux функция fork используется для создания нового процесса. Также для каждого процесса существует разное пространство виртуальной памяти. Для потоков существует только одна общая виртуальная память. Кроме того, API-интерфейс fork может имитировать в Windows (до некоторой степени) с помощью встроенного API RtlCloneUserProcess.
1. Короткий ответ - нет, ничего подобного fork()
в Win32 API, но это должно быть возможно реализовать, так как CygWin предоставляет полнофункциональный fork() в Windows. Но вам, похоже, на самом деле не нужно fork()
для вашего приложения.
2. На самом деле ваши варианты:
- Создайте хотя бы один поток / процесс для каждого клиента / соединения
- Создайте только один поток / процесс для всех клиентов / соединений (используя в качестве примера управляемый событиями подход)
- Смешайте два выше
Лучший подход зависит от вашего приложения, но для обработки максимум 40 одновременных клиентов у вас вполне может быть один поток для каждого клиента.
Вы можете использовать стандартную библиотеку потоков POSIX pthread
создавать и управлять потоками. Эта библиотека является стандартной во всех POSIX-совместимых ОС (GNU/Linux, Mac OS X, BSD и т. Д.) И была портирована на Windows. Таким образом, этот подход позволит вам иметь очень хорошую переносимость.
Хотя, если вы хотите использовать Win32 API, вам стоит взглянуть на CreateThread.