Именованный канал дуплексной связи между Python и C # зависает - PullRequest
0 голосов
/ 04 октября 2019

Я реализую именованный канал дуплексной связи между python (сервер канала) и C # (клиент канала). Если сервер канала читает из канала, а затем пишет в него, а клиент канала делает это наоборот, это работает. Однако, когда я изменяю порядок так, что труба-сервер пишет, а затем читает, а труба-клиент делает это наоборот, программа зависает при чтении (ReadLine()) без каких-либо ошибок или исключений. Я реализую обработку исключений, но здесь опускаю ее для лучшего обзора.

Следующий код работает правильно:

# Python 2 pipe server (ReadThenWrite)
pipe_handle = win32pipe.CreateNamedPipe(pipeName, win32pipe.PIPE_ACCESS_DUPLEX, ...)
win32pipe.ConnectNamedPipe(pipe_handle, None)

(_, read_message) = win32file.ReadFile(pipe_handle, 1000)
print('Received: ' + read_message)

win32file.WriteFile(pipe_handle, 'server')

win32file.FlushFileBuffers(pipe_handle)
win32pipe.DisconnectNamedPipe(pipe_handle)
win32file.CloseHandle(pipe_handle)
// C# pipe client (WriteThenRead)
NamedPipeClientStream pipeClient = NamedPipeClientStream(".", pipeName, PipeDirection.InOut)
pipeClient.Connect();

StreamWriter sw = new StreamWriter(pipeClient);
sw.AutoFlush = true;
sw.WriteLine("client");

StreamReader sr = new StreamReader(pipeClient);
string temp = sr.ReadLine();
Console.WriteLine("Received: " + temp);

В следующем коде только порядок чтенияи запись поменялась местами, и больше ничего не изменилось. Как ни странно, приложение C # зависает при чтении.

# Python 2 pipe server (WriteThenRead)
pipe_handle = win32pipe.CreateNamedPipe(pipeName, win32pipe.PIPE_ACCESS_DUPLEX, ...)
win32pipe.ConnectNamedPipe(pipe_handle, None)

win32file.WriteFile(pipe_handle, 'server')

(_, read_message) = win32file.ReadFile(pipe_handle, 1000)
print('Received: ' + read_message)

win32file.FlushFileBuffers(pipe_handle)
win32pipe.DisconnectNamedPipe(pipe_handle)
win32file.CloseHandle(pipe_handle)
// C# pipe client (ReadThenWrite)
NamedPipeClientStream pipeClient = NamedPipeClientStream(".", pipeName, PipeDirection.InOut)
pipeClient.Connect();

StreamReader sr = new StreamReader(pipeClient);
string temp = sr.ReadLine(); // here it hangs
Console.WriteLine("Received: " + temp);

StreamWriter sw = new StreamWriter(pipeClient);
sw.AutoFlush = true;
sw.WriteLine("client");

Если чтение канала удалено на канальном сервере (WriteThenRead), клиент канала не зависает и читает сообщение.

AsВ качестве обходного пути, сервер канала снова создает канал после записи (соответственно перед чтением), и клиент канала снова подключается к нему перед записью (соответственно после чтения). Но тогда он не используется как дуплексный канал.

Почему происходит такое поведение? Как это можно решить?

Любая помощь будет оценена, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...