Именованные каналы Windows не работают по сети? - PullRequest
0 голосов
/ 13 апреля 2011

У меня странные проблемы с именованными каналами в Windows в C #.

Клиент:

    NamedPipeClientStream pipeStream = new NamedPipeClientStream("default-PC","mypipe");

    pipeStream.Connect();
    BinaryWriter sw = new BinaryWriter(pipeStream);
    sw.Write((byte[]) data);

Сервер:

    NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe");
    byte[] dataAll = null;
    pipeStream.WaitForConnection();
    dataAll = new BinaryReader(pipeStream).ReadBytes(1024 * 1000 * 512);

-

Если я использую "." в качестве имени сервера в конструкторе для NamedPipeClientStream все работает правильно, то есть сервер заполняет объект dataAll.

Теперь странно то, что , если я, с другой стороны, ввожу сетевое имя компьютера ("ПК по умолчанию") в NamedPipeClientStream , как показано в приведенном выше коде , тогда никаких данных читается на сервере , поскольку ReadBytes в коде сервера возвращает пустой массив.

Это может быть понятно, я запускал сервер и клиент на двух разных компьютерах, но они оба работают на одной машине. Единственная разница заключается в том, является ли параметр «имя сервера» в NamedPipeClientStream "." или фактическое имя сети (или даже localhost).

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Я считаю, что оба "." и "localhost" считаются специальными именами и не используют обычные сетевые подключения, но представляют собой петлю определенного типа.

Когда вы указываете имя компьютера, даже имя вашего собственного компьютера, оно использует стандартные сетевые протоколы / стек / и т. Д.

Возможно, вам нужно открыть порт брандмауэра. TCP 445. Также, по умолчанию , Windows разрешает все исходящие сообщения. Вам нужно только добавить исключение для входящего порта. Ваша конфигурация может меняться, конечно. .NET 3.5 (C #) Именованные каналы по сети

1 голос
/ 14 апреля 2011

Итак, вывод такой:

Если параметр имени сервера в NamedPipeClientStream - это нечто иное, чем "."затем базовая реализация проходит через транспортный уровень, который поддерживает максимум 64 КБ в одной операции записи.Проблема в том, что если вы записываете более 64 КБ, тогда данные просто исчезают, а не выдают исключение.

Решение состоит в том, чтобы напрямую использовать NamedPipeClientStream и записывать данные менее чем по 64 КБ.

...