2016-04-08 25 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

WriteFile()を呼び出してもFlushFileBuffers(hPipe)を追加しましたが、何も表示されません。 – 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

これは実際に問題全体を修正しました。私はCodeprojectのどこかにC#コードを見つけて、正しく動作していると仮定しました。本当にありがとう。 – Roel

関連する問題