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

相關問題