Я пишу эту программу на 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);.
Вот и всё!
Сборка персонального компьютера от Artline: умный выбор для современных пользователей