Проблемы клиента/сервера .NET NamedPipes. Сервер не может ответить клиенту: «Невозможно получить доступ к закрытому канаC#

Место общения программистов C#
Ответить
Anonymous
 Проблемы клиента/сервера .NET NamedPipes. Сервер не может ответить клиенту: «Невозможно получить доступ к закрытому кана

Сообщение Anonymous »

Я пытаюсь создать базовый обмен сообщениями клиент/сервер между двумя приложениями .NET. Я хочу, чтобы клиент подключился к серверу, а затем отправил сообщение. Затем сервер получит это сообщение и ответит с результатом. Я собираюсь реализовать базовый API.
Код сервера выглядит следующим образом:

Код: Выделить всё

// PipeSecurity ps = new PipeSecurity() and ACL rules here...

NamedPipeServerStream pipeServer = NamedPipeServerStreamAcl.Create("my_pipe", PipeDirection.InOut, 10, PipeTransmissionMode.Message, PipeOptions.Asynchronous, default, default, ps);

StreamReader sr = new StreamReader(pipeServer);
StreamWriter sw = new StreamWriter(pipeServer);

while (true)
{
try
{
// Wait for a connection
pipeServer.WaitForConnection();

// Read the message from the client
string messageFromClient = sr.ReadLine();
Trace.WriteLine($"IPC Message Reveived: {messageFromClient}", "info");

// Reply back to the client
sw.WriteLine("PONG!");
sw.Flush();

pipeServer.WaitForPipeDrain();

pipeServer.Close();

} catch (Exception ex) {

Trace.WriteLine($"ipc_server error: {ex}", "error");

} finally {

pipeServer.WaitForPipeDrain();

if (pipeServer.IsConnected) {

pipeServer.Disconnect();

}
}
и затем на клиенте у меня есть следующее:

Код: Выделить всё

var pipeClient = new NamedPipeClientStream(".",
"my_pipe", PipeDirection.InOut, PipeOptions.None);

try
{
// Connect to pipe
if (pipeClient.IsConnected != true) { pipeClient.Connect(); }

StreamReader sr = new StreamReader(pipeClient);
StreamWriter sw = new StreamWriter(pipeClient);

// Send a message
sw.WriteLine("PING!");
sw.Flush();

pipeClient.WaitForPipeDrain();

// Perhaps my client is closing or not waiting long enough here
// for the server to reply??

// Receive a message
string message_from_server = sr.ReadLine();
Console.WriteLine(message_from_server);

pipeClient.Close();

} catch (Exception ex) {

Console.WriteLine($"Error: {ex}");
}
После этого я получаю следующую ошибку на сервере. На клиенте не выдается никаких ошибок, и клиент не видит понг.:

Код: Выделить всё

info: IPC Message Reveived: PING!
Exception thrown: 'System.ObjectDisposedException' in System.IO.Pipes.dll
An unhandled exception of type 'System.ObjectDisposedException' occurred in System.IO.Pipes.dll
Cannot access a closed pipe.
Я думаю, что это как-то связано с тем, что клиент закрывает канал до ответа сервера, но я пытаюсь понять, в этом ли проблема и как ее решить.
Любая помощь приветствуется! Также буду рад отзывам о моей обработке ошибок и о том, как сделать сервер неблокирующим, это моя следующая работа.

Подробнее здесь: https://stackoverflow.com/questions/786 ... client-can
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»