Как использовать именованные каналы по сети? - PullRequest
3 голосов
/ 25 мая 2011

Я пытаюсь создать соединение по сети через именованные каналы. Я делаю это, как написано в msdn . Я создаю трубу на стороне сервера с функцией.

CreateNamedPipe(
                     "\\\\.\\pipe\\myNamedPipe",
                     DUPLEX | FILE_FLAG_OVERLAPPED,
                     0,
                     255,
                     BUFFER_SIZE,
                     BUFFER_SIZE,
                     0,
                     IntPtr.Zero);

и пытается подключиться через функцию CreateFile ()

CreateFile(
                  "\\\\10.0.0.29\\pipe\\myNamedPipe",
                  GENERIC_READ | GENERIC_WRITE,
                  0,
                  IntPtr.Zero,
                  OPEN_EXISTING,
                  FILE_FLAG_OVERLAPPED,
                  IntPtr.Zero);

10.0.0.29 - серверная машина ip. Если я пытаюсь запустить клиентскую программу на сервере с именем канала "\\. \ Pipe \ myNamedPipe" или "\\ 10.0.0.29 \ pipe \ myNamedPipe" (10.0.0.29 - это ip серверов) или "\\ localhost \ pipe \ myNamedPipe "работает нормально.

Так как использовать именованные каналы по сети?

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Начиная с версии 3.5, именованные каналы изначально поддерживаются в .NET Framework, вам не нужно использовать утомительный код взаимодействия p / invoke.См. Эту вводную статью здесь: .NET 3.5 добавляет поддержку именованных каналов для образца.

Используя эту перегрузку конструктора, NamedPipeClientStream Constructor (String, String) , вы можетепередать аргумент имени сервера.

2 голосов
/ 28 марта 2012

Я думаю, что на вопрос дан ответ выше, но имейте в виду, что существует большая проблема с использованием именованных каналов, которые открыты для удаленной машины. Когда вы вызываете функцию Windows API WaitNamedPipe с таймаутом, превышающим 0, вызывающий поток будет использовать весь ЦП до тех пор, пока именованный канал не подключится или не истечет время ожидания. При тайм-ауте, равном 0, у него недостаточно времени для создания удаленного соединения, поэтому вы в основном вынуждены использовать весь ЦП каждый раз, когда пытаетесь подключиться, и все, что вы можете сделать, - это тайм-аут и повторить попытку позже .

Я столкнулся с этой проблемой и обнаружил, что я не одинок: http://social.msdn.microsoft.com/Forums/sv-SE/netfxnetcom/thread/7bbf5a0b-3c22-4836-b271-999e514c321b

Пока Microsoft не предоставит более удобный для производительности способ подключения к удаленным именованным каналам, я собираюсь прекратить их полное использование и предлагаю вам сделать то же самое. Если по какой-либо причине вы не можете подключиться практически сразу, у вас получается livelock.

2 голосов
/ 25 мая 2011

Pipe Server должен иметь имя, которое необходимо указать для сервера, а не IP-адрес.

См. Этот учебник.

Однако именованные каналы удобны для локальных соединений, потому что в сети вы получаете издержки инкапсуляции TCP, что делает использование именованных каналов неудобным.

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

...