none
Обмен данными между процессами RRS feed

  • Вопрос

  • VS 2008, c#, Framework 3.5.
    Мне нужно разработать несколько приложений, которые будут взаимодействовать между собой.
    Одно из них как сервер, должно отвечать на запросы других (клиентов). Предполагаю, что именованные каналы как раз подойдут.
    Но возникли вопросы.
    Наиболее понятен такой способ взаимодействия этих приложений:
    - сервер создает поток и в нем - получает Stream именованного канала (NamedPipeServerStream), ожидающий вызова (WaitForConnection);
    - клиент, по мере необходимости, создает клиентскую часть Stream именованного канала (NamedPipeClientStream) и выполняет соединение (Connect)
    - по событию соединения происходит обмен данными, и сервер отсоединяется (Disconnect), а клиент закрывает (Close) Stream канала.
    Проблема в том, что количество таких сеансов связи ограничено: как я понял, со стороны сервера, количество Stream именованного канала может быть создано не более 254.
    Предполагается, что за цикл работы приложений таких "сеансов" обмена данными должно быть значительно больше.
    Может Было бы лучше вообще со стороны сервера не отсоединяться, и со стороны клиента не закрывать канал, а через какой-то промежуток времени выполнить обмен данными по этому каналу. Но в этом случае, как серверу отследить постуление запроса от клиента? WaitForConnection тут не подойдет, ведь соединение уже есть.
    Подскажите, как эту проблему решить? 
    24 декабря 2010 г. 7:23

Ответы

  • Вот пример. http://msdn.microsoft.com/ru-ru/library/bb546085.aspx
    Если numThreads>254 - сообщение об ошибке: maxNumberOfServerInstances должно иметь значение от 1 до 254 или NamedPipeServerStream.MaxAllowedServerInstances (для получения максимального числа, разрешенного системными ресурсами).

    Есть такое предчувствие, что канал не закрывается. Проверь через брейк поинт на всякий случай.

    Вот тут в заметках сказано следующее: Используйте атрибут MaxAllowedServerInstances при создании объекта NamedPipeServerStream, чтобы задать максимальное число экземпляров сервера, допустимое при данных системных ресурсах.

    То есть как я понимаю, это зависит каким-то образом от системы, где запущено приложение.

    И все-таки похоже, что ты не закрываешь созданные экземпляры сервера и они у тебя просто напросто копятся.


    E-mail: Svatoslav.Pankratov@gmail.com
    • Помечено в качестве ответа Abolmasov Dmitry 28 декабря 2010 г. 20:05
    27 декабря 2010 г. 23:11
  • Спасибо, конечно, за помощь. Хотя, как я понял и Вы не нашли описание этотого атрибута MaxAllowedServerInstances. Наверное действительно, в том примере, который мне попался, что-то не так работает. Построил кое-что по другому (последовательно создавая  и закрывая каналы) и дело пошло!

    • Помечено в качестве ответа Abolmasov Dmitry 28 декабря 2010 г. 20:06
    28 декабря 2010 г. 13:56

Все ответы

  • - по событию соединения происходит обмен данными, и сервер отсоединяется (Disconnect), а клиент закрывает (Close) Stream канала.
    Проблема в том, что количество таких сеансов связи ограничено: как я понял, со стороны сервера, количество Stream именованного канала может быть создано не более 254.
    Откуда такая информация, если не секрет?
    E-mail: Svatoslav.Pankratov@gmail.com
    26 декабря 2010 г. 8:32
  • Предполагается, что за цикл работы приложений таких "сеансов" обмена данными должно быть значительно больше.
    Может Было бы лучше вообще со стороны сервера не отсоединяться, и со стороны клиента не закрывать канал, а через какой-то промежуток времени выполнить обмен данными по этому каналу. Но в этом случае, как серверу отследить постуление запроса от клиента? WaitForConnection тут не подойдет, ведь соединение уже есть.
    Как вариант, использовать Socket. Там, сервер будет ждать пока не поступит какое-либо сообщение от клиента, и только после этого начнет получение сообщения и его дальнейшую обработку.
    E-mail: Svatoslav.Pankratov@gmail.com
    26 декабря 2010 г. 8:35
  • Вот пример. http://msdn.microsoft.com/ru-ru/library/bb546085.aspx
    Если numThreads>254 - сообщение об ошибке: maxNumberOfServerInstances должно иметь значение от 1 до 254 или NamedPipeServerStream.MaxAllowedServerInstances (для получения максимального числа, разрешенного системными ресурсами).
    27 декабря 2010 г. 6:11
  • Мне кажется, что с помощью Socet будет сложнее.  Приложение для локальной сети. Настройки могут быть разные, часть портов закрыта. Хотелось бы все-таки разобраться с именованными каналами.

    27 декабря 2010 г. 6:41
  • Вот пример. http://msdn.microsoft.com/ru-ru/library/bb546085.aspx
    Если numThreads>254 - сообщение об ошибке: maxNumberOfServerInstances должно иметь значение от 1 до 254 или NamedPipeServerStream.MaxAllowedServerInstances (для получения максимального числа, разрешенного системными ресурсами).

    Есть такое предчувствие, что канал не закрывается. Проверь через брейк поинт на всякий случай.

    Вот тут в заметках сказано следующее: Используйте атрибут MaxAllowedServerInstances при создании объекта NamedPipeServerStream, чтобы задать максимальное число экземпляров сервера, допустимое при данных системных ресурсах.

    То есть как я понимаю, это зависит каким-то образом от системы, где запущено приложение.

    И все-таки похоже, что ты не закрываешь созданные экземпляры сервера и они у тебя просто напросто копятся.


    E-mail: Svatoslav.Pankratov@gmail.com
    • Помечено в качестве ответа Abolmasov Dmitry 28 декабря 2010 г. 20:05
    27 декабря 2010 г. 23:11
  • Спасибо, конечно, за помощь. Хотя, как я понял и Вы не нашли описание этотого атрибута MaxAllowedServerInstances. Наверное действительно, в том примере, который мне попался, что-то не так работает. Построил кое-что по другому (последовательно создавая  и закрывая каналы) и дело пошло!

    • Помечено в качестве ответа Abolmasov Dmitry 28 декабря 2010 г. 20:06
    28 декабря 2010 г. 13:56