ERROR_PIPE_BUSY при переподключении к именованному каналу

104
27 июня 2021, 10:10

Нужно организовать межпроцессорное взаимодействие через именованные каналы. На стороне сервера делается так:

pipeServer = new NamedPipeServerStream(pipeName, PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances);
pipeServer.WaitForConnectionAsync();
...
if (pipeServer.IsConnected) {
     // send data.
}

Клиент подключается следующим образом:

hPipe = CreateFile(lpszPipeName,
    GENERIC_READ | GENERIC_WRITE, 0, NULL,
    OPEN_EXISTING, 0, NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
    printf("Pipe open error: %d\n", GetLastError());
    EXIT();
}
DWORD dwMode = PIPE_READMODE_BYTE;
if (!SetNamedPipeHandleState(hPipe, &dwMode, NULL, NULL))
{
    printf("Set pipe handle state error: %d\n", GetLastError());
    EXIT();
}
// read write data.

При переподключении возникает ошибка: 231 ERROR_PIPE_BUSY. Странно, что после отключения клиента pipeServer.IsConnected имеет значение True, пока сервер не попытается прочитать или отправить данные через канал (там ожидаемое IOException).

Отключаю так:

DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
READ ALSO
C# Обращение к классу из любого класса

C# Обращение к классу из любого класса

Допустим есть класс Repository, есть входная точка в программу класс Server, в Server'e происходит вызов класса Repository в котором в конструкторе происходит...

119
setMeta не устанавливает новые значения?

setMeta не устанавливает новые значения?

Добрый день есть такие файлы

120