Именованные каналы: сервер C#, клиент C++

Я написал 2 пары клиент-серверных программ с именованными каналами: 1-я пара на C# (.NET 4) 2-я пара на C++ (неуправляемая)

Все 4 тестовые программы используют одно и то же имя канала \\.\pipe\mypipe

Пара С# отлично работает друг с другом - я отправляю сообщение от клиента, и оно принимается сервером. Пара С++ также отлично работает друг с другом.

Но... когда я пытаюсь запустить клиент С# с сервером С++ или клиент С++ с сервером С#, это не работает. Клиент не может подключиться к серверу.

Есть ли что-то, что мешает клиенту C++ работать с сервером .NET? Должно ли это работать?

Спасибо.


person yaronkl    schedule 16.02.2016    source источник
comment
Если вы отправляете двоичные данные, вы уверены, что двоичный формат совпадает между двумя реализациями?   -  person crashmstr    schedule 16.02.2016
comment
Проблема перед отправкой данных. Проблема в том, что открытие канала на стороне клиента не удается.   -  person yaronkl    schedule 16.02.2016
comment
Как это не удается? Вы получаете исключение, приложение зависает?   -  person thorkia    schedule 16.02.2016
comment
Вот как клиент открывает канал: ‹pre› hPipe=CreateFile(\\\\.\\pipe\\mypipe, GENERIC_WRITE,//GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL) ; если (hPipe!=INVALID_HANDLE_VALUE) { вернуть 0; //Успех!!! } ошибка = GetLastError(); if(err!=ERROR_PIPE_BUSY) { printf(Не удалось открыть канал, GetLastError=%u\n, ошибка); возврат -1 ; } ‹/pre› Создать файл возвращает недопустимый дескриптор. GetLastError() возвращает 2.   -  person yaronkl    schedule 17.02.2016
comment
Что такое значение имени канала С#? Это мой пайп?   -  person alexm    schedule 17.02.2016
comment
Это \\\\.\\pipe\\mypipe   -  person yaronkl    schedule 17.02.2016
comment
NamedPipeClientStream, NamedPipeServerStream C# автоматически добавляет \.\\pipe\ к имени.   -  person alexm    schedule 17.02.2016
comment
Спасибо Алексей, это решило проблему.   -  person yaronkl    schedule 17.02.2016


Ответы (1)


NamedPipeClientStream и NamedPipeServerStream добавляют префикс "\\.\pipe\" к имени автоматически.

Код клиента С++:

hPipe = CreateFile("\\\\.\\pipe\\mypipe", ...)

соответствующий код сервера С#:

var pipe = new NamedPipeServerStream("mypipe", ...)
person alexm    schedule 17.02.2016
comment
@yaronkl, если этот ответ решил вашу проблему, вы должны отметить его как ответ - person crashmstr; 17.02.2016
comment
Технически NamedPipeClientStream и NamedPipeServerStream добавляют \\.\pipe\ к имени. Добавить означает добавить после текста. Если бы они добавились, имя mypipe превратилось бы в mypipe\\.\pipe\ - person thorkia; 17.02.2016