Передать сокет в другой процесс?

Тема в разделе "WASM.NETWORKS", создана пользователем _DEN_, 21 сен 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    На первый взгляд идея кажется бредом, но все же, вдруг есть какой-то старый индейский способ?

    Суть такова: я хочу, чтобы каждый запрос сервер отрабатывает в отдельном процессе, как это например умеет делать апач. Вот какие сценарии приходят в голову:

    1. Сервер принимает входящее соединение, стартует второй процесс и каким-то магическим образом передает второму процессу сокет o_O
    2. Сервер принимает входящее соединение, стартует второй процесс, второй процесс коннектится на сервер по локалхосту, отрабатывает запрос, передает респонс, а сервер просто форвардит этот респонс клиенту.
    3. Сервер принимает входящее соединение, стартует второй процесс, и больше не принимает соединение, а занимается отработкой запроса и отсылкой ответа, а ожиданием следующего клиента уже занимается только что запущенный процесс.

    Какие варианты есть еще? Какие варианты в принципе используются в жизни?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    DuplicateHandle
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    _DEN_
    Гугл за 2 минуты дал. Х.з как работает, никогда не юзал.

    WSADuplicateSocket http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx

    Это для винды. Для никсов fork должен без проблем решить вопрос. Хотя тоже х.з.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Я может быть сейчас спорю чушь, но насколько я знаю, в винде сокет привязывается к IOCP только один раз, и потом его сменить нельзя, а на втором процессе есть свой IOCP, с которым надо работать...
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Я не знаю, о чем ты сейчас говоришь, но пользоваться одним сокетом в двух разных процессах можно. Апи для этого тебе назвали
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MSoft

    http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _DEN_
    Думал что это не обьект ? =)
    Смотреть WSPDuplicateSocket().
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Надо эксперементировать. Я сейчас не совсем понимаю, прокатит ли дублирование сокета при его передаче с одного boost::asio::io_service на другой.
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    _DEN_, какая ось? Если вин, то зачем создавать другой процесс, есть треды. Если никс, пишите в память процесса и int 80h вам в руки.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    litrovith
    Вин. Процесс нужен потому что в нем будет жить бажная либа, которая виснет, крашится и мемликает. Чтобы проблемы либы не оборачивались проблемами для ее клиентов.
     
  11. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    >> DuplicateHandle

    если в системе установлен non-ifs lsp, то это не прокатит.
     
  12. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    _DEN_
    Распространяя *nix'овый опыт могу сказать, что напрашиваются два варианта.
    Либо:
    Только я бы вывернул всё несколько иначе. Второй процесс запустил бы как и первый -- демоном. И первый работал бы как прокси. В венде, говорят, процессы долго стартуют, и запускать на каждое соединение по процессу накладненько будет. По необходимости, можно запустить N "вторых" процессов, и разбрасывать входящие соединения по ним ровным слоем.
    Либо SHM. Я уверен что в венде должно быть что-то этого рода. Завести кусок памяти доступный в rw обоим процессам. Первый туда пишет read'ом, второй оттуда читает. Только при таком подходе, очень сложно присобачить стандартные user-space библиотеки IO: они не умеют работать с SHM, и заполнять их буфера из одного процесса, а освобождать из другого -- это нетривиальная задача. Хотя, я уверен, C++ программист, привыкший ковыряться в исходниках STL и Boost с этим справится вполпинка. С stdio это сложно провернуть, поскольку там не предусмотрено создание типов производных от FILE. А с чисто C++ библиотекой, всё должно быть просто, как я понимаю.
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    погуглил эти страшные слова и вот какую ссылку нашел: http://www.rsdn.ru/forum/winapi/1294114.flat.aspx
    возможно, она поможет ТС
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    r90

    В бусте есть Boost.Interprocess - там и шаред мемори, и прочие плюшки. С тредпулом с процессами вместо тредов идея хорошая, но у меня скорость старта процесса не критична - это клиент-серверная система для малого числа юзеров, работающая в локалке - на нее не будут ломиться по стопитсот человек одновременно :) То есть у меня можно сделать выбор в пользу простоты, т.к. оверхед не страшен.

    А как работает апач? Просто дупает хендл и форкается?
     
  15. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    _DEN_
    На венде? Не знаю. В апаче есть несколько т.н. Multi-Processing Modules, в частности есть модуль под названием winnt. Как он работает я не вникал. В *nix'ах, как я понимаю, слушающий сокет слушают все процессы и все потоки каждого процесса. Как-то там синхронизируются, чтобы одновременно не вызывать select, и кто первый крикнет accept, тот и будет разгребать соединение.
    Или ты про то, как он передаёт сокет потенциально бажной "библиотеке" типа скрипта на php, написанного быдлокодером? А этим занимается не апач, а модули, типа mod_php, mod_cgi, mod_proxy и т.п. И в разных ситуациях используются разные модули.
     
  16. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    _DEN_, зачем "дупать хендл" если есть accept, возвращаемый хендл которого передаётся в создаваемый поток. Индеец, епта!

    add
    seh заюзать не судьба?
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    факт что поможет? ( вопрос риторический ) , но ответ НЕТ.
    К примеру, либа просто портит свои же данные и виснет, даже эксепшена нету.
     
  18. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    spa, Риторический ответ: факт в том, что лучше наступать на СВОИ грабли(к держаку можно подушку прикрутить и не падать!).
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    litrovith

    Ты еще свой драйвер предложи написать.
     
  20. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    _DEN_, научитесь читать. И ,не прибегая к индейской магии, у вас всё получится, или подкиньте мне кофейной гущи.