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

Я пытаюсь создать соединение по сети через именованные каналы. Я делаю это, как говорится в 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 ответа

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

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

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

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

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

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

Смотрите этот урок.

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

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

Другие вопросы по тегам