Я пишу эту программу на C# с использованием .NET Framework 4.7.1 (последняя на момент написания вопроса). На стороне с NamedPipeServerStream всё в порядке, работает так, как надо. У вот у клиентов чтение/запись работают, но не работает флаг IsMessageComplete. Получаю: "Исключение Возникло исключение "System.InvalidOperationException" в System.Core.dll ("ReadMode не принадлежит к PipeTransmissionMode.Message.")"
. Я пробовал клиенту давать флаг "PipeTransmissionMode.Message", но он ругается "Дескриптор канала не задан. Совершила ли реализация PipeStream вызов InitializeHandle?"
, а этой функции даже нет в классе PipeStream + неужели клиенту для работы надо передавать дескриптор сервера (он не передаётся сам?)? Ещё один pipe делать что ли?
Код объявления сервера:
NamedPipeServerStream npserver = new NamedPipeServerStream("pipe1", PipeDirection.InOut, 5, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 128, 128);
Код объявления клиента:
NamedPipeClientStream plc = new NamedPipeClientStream(".", "pipe1", PipeDirection.InOut, PipeOptions.Asynchronous);
Вот класс работы с клиентом (код работы с сервером такой же, но заменены NamedPipeClientStream
на NamedPipeServerStream
):
class StreamOperations
{
public StreamOperations(ref NamedPipeClientStream server)
{
this.server = server;
}
byte[] buffer1 = new byte[128];
byte count;
string str;
volatile NamedPipeClientStream server;
public byte RQ1_Read()
{
count = (byte)server.Read(buffer1, 0, buffer1.Length);
str = Encoding.ASCII.GetString(buffer1, 0, count);
return count;
}
public byte RQ1_ReadBig()
{
byte[] str = new byte[0];
count = (byte)server.Read(buffer1, 0, buffer1.Length);
str = str.Concat(buffer1.Take(count)).ToArray();
while (!server.IsMessageComplete) //Тут в клиенте возникает ошибка
{
count = (byte)server.Read(buffer1, 0, buffer1.Length);
str = str.Concat(buffer1.Take(count)).ToArray();
}
this.str = Encoding.ASCII.GetString(str, 0, str.Length);
return (byte)(count == 0 ? 0 : 1);
}
public string RQ2_KString()
{
return str;
}
public void Write(string str)
{
server.Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
}
}
Обратившись к форуму, нашёл ответ на свой вопрос!
А Ларчик просто открывался.
Нужно было прописать plc.ReadMode = PipeTransmissionMode.Message;
после plc.Connect(1000);
.
Вот и всё!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Условие задачи почти полностью выполнено, застрял на моменте когда нужно вывесли кол-во нулей из всех вводимых чисел, не понимаю синтаксиса...
Подскажите, как в приложении WPF эмулировать программно нажатие на кнопку Button левой клавишей мыши? Использовать button1PerformClick() не предлагать,...
При использовании на контексте SaveChanges() или SaveChangesAsync() после добавления какого-то элемента в экземпляр контекста изменения сохраняются только...