2016-04-08 3 views
1

У меня есть сервер C# и клиент C++. Сервер C# отлично работает, когда я тестировал его с помощью клиента C#, и все сообщения от клиента были правильно перенесены на сервер. Однако при реализации клиента C++ я, похоже, сталкиваюсь с определенными проблемами.Именованная связь между сервером C# и клиентом C++

Прежде всего, это мой C# сервер:

Task.Factory.StartNew(() => 
       { 
        NamedPipeServerStream server = new NamedPipeServerStream(name); 
        server.WaitForConnection(); 

        StreamReader reader = new StreamReader(server); 

        Console.WriteLine("Client connected"); 

        while (true) 
        { 
         if (reader.ReadLine() != null) 
          Console.WriteLine(reader.ReadLine()); 
        } 
       }); 

Переменная name передается в качестве параметра метода. Моего C++ код выглядит следующим образом: выход

HANDLE hPipe; 
    DWORD dwWritten; 

    hPipe = CreateFile(TEXT("\\\\.\\pipe\\testpipe"), 
     GENERIC_READ | GENERIC_WRITE, 
     0, 
     NULL, 
     OPEN_EXISTING, 
     0, 
     NULL); 
    if (hPipe != INVALID_HANDLE_VALUE) 
    { 
     WriteFile(hPipe, 
      "Hello Pipe\n", 
      12, // = length of string + terminating '\0' !!! 
      &dwWritten, 
      NULL); 

     CloseHandle(hPipe); 
    } 

В серверах заключается в следующем:

[PIPE] Client connected 
[PIPE] 

Кто есть какие-либо предложения? Возможно, я все это ошибаюсь, так как я совершенно новый в трубах.

Заранее спасибо.

+0

Вы пытались очистить файловые буферы перед закрытием дескриптора на стороне C++? https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx –

+0

Я добавил FlushFileBuffers (hPipe) после вызова WriteFile(), но все равно ничего. – Roel

ответ

1

Трудно диагностировать код, особенно код сети, без хорошего Minimal, Complete, and Verifiable example, который надежно воспроизводит проблему. Но C# код вашего сервера имеет по крайней мере одну вопиющую проблему:

while (true) 
{ 
    if (reader.ReadLine() != null) 
     Console.WriteLine(reader.ReadLine()); 
} 

Здесь вы сначала прочитать строку из потока, а затем, если это не null, вы читали другой линии и отобразить это. Это означает, что вы отбрасываете каждую отправляемую линию.

Петля должна выглядеть примерно так:

string line; 

while ((line = reader.ReadLine()) != null) 
{ 
    Console.WriteLine(line); 
} 

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

+0

Это фактически устранило всю проблему. Я нашел код C# где-то на Codeproject и предположил, что он работает правильно. Огромное спасибо. – Roel

Смежные вопросы