Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.
Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?
11.06.10 12:40: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, hooky-mars, Вы писали:
HM>По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam
Хотя, врядли этобудет работать.
Да и вообще врядли такое возможно.
Разве только настроить в дочерних потоках сокет слушающий все пакеты. А родительский процесс, передает этому доечернему параметры фильтрации, но в таком случае не рпотает отправка.
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.
Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC)
Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами)
Тип сокета должен быть известен всем процессам (TLS, SSL, etc)
зы: кстати, вы в какой операционке?
Здравствуйте, hooky-mars, Вы писали:
HM>Здравствуйте, hooky-mars, Вы писали:
HM>>По идее сокет это дескриптор, передаете его своему процессу через, например, систему событий ОС, в LParam HM>Хотя, врядли этобудет работать. HM>Да и вообще врядли такое возможно. HM>Разве только настроить в дочерних потоках сокет слушающий все пакеты. А родительский процесс, передает этому доечернему параметры фильтрации, но в таком случае не рпотает отправка.
Где то видел пример когда fork происходит на accept-е....но это не подходит.
Т.е. гарантированно невозможно получить дескриптор сокета в дочернем потоке(при этом закрыв его в родительском)?
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, Аноним, Вы писали:
А>>Добрый день.
А>>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec. U>Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC) U>Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами) U>Тип сокета должен быть известен всем процессам (TLS, SSL, etc) U>зы: кстати, вы в какой операционке?
IPC — pipe
ОС: FreeBSD
Можно ли при этом высвободить ресурс закрыв дескриптор в родители?
Здравствуйте, _ASD_, Вы писали:
_AS>Здравствуйте, uzhas, Вы писали:
U>>Здравствуйте, Аноним, Вы писали:
А>>>Добрый день.
А>>>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec. U>>Передавайте сокет другим процессам через любой IPC (разделяемая память, именованные пайпы, TCP, (L)RPC) U>>Возможно, вокруг секурити надо попрыгать, но должно работать и в винде и в линуксе (со своими платформ-спесифик танцами) U>>Тип сокета должен быть известен всем процессам (TLS, SSL, etc) U>>зы: кстати, вы в какой операционке?
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec. А>Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?
Для UNIX-сокетов есть такакая возможность: http://linux.die.net/man/7/unix (искать SCM_RIGHTS). Но вообще так делат не принято — передача сокетов обычно делается через наследование после fork()'а. Если сделать не один "принимающий" сокет, а по числу контекстов, то задача решается тривиально.
т.е. задача такова: обрабатываются веб-сессии(у клиента браузер).
1. Родительский процесс порождает дочернии процессы.
2. Слушает порт.
3. получает входящую сессию от клиента, соотносит с внутренней таблицей маршрутизации процессов. Если новый клиент заставляет его авторизоваться, если уже "засветился" отдает дескриптор сокет сопоставимому дочернему процессу.
4. дочерний процесс обрабатывает запрос пользователя, и отдает ответ пользователю. сохраняя сессию клиента, как бы "зеркаля" состояние клиента.
5. и т.д.
Т.е. запросы клиента(вернее ответы для него очень объемные), тем самым дочерний процесс должен был сохранять текущее состояние клиента, для последуещго запроса
Здравствуйте, Аноним, Вы писали:
А>Возможно ли передать сокет другому процессу. Задача усложняется тем что пул процессов должен быть создан заранее и в каждом из процессов свой "движек" запускаемый через exec.
google://SCM_RIGHTS
в сети есть готовые примеры. Работает, кажется, везде, где Unix и BSD sockets (винду не вспоминать).
А>Т.е. парент процесс слушае и "диспетчерезирует" входящие соединения и в зависимости от контекста должен отдавать сокет тому или иному дочернему процессу. и опять же как "движек" должен получить сокет?
Вот так и получает.
Но вообще есть и другие методы. Например, Apache с prefork'ом делает, что процессы из пула решают, кто сейчас обрабатывает следующее соединение.