2012-10-06 79 views
3

我已經基於主要寫了Namedpipeserver超時:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365588(v=vs.85).aspx
當我嘗試使用此代碼從一個.NET客戶端連接到它:NamedpipeClientStream無法連接,不斷

NamedPipeClientStream clientPipe = new NamedPipeClientStream(".",  
    "\\\\.\\pipe\\TTCUIHELPER_SEND_TTC_RECEIVE",PipeDirection.Out); 
try 
{   

    if (clientPipe != null) 
    { 
     clientPipe.Connect(5000); 
     if (clientPipe.IsConnected == true) 
     { 
      byte[] bytes = pm.GetMessageData(); 
      clientPipe.Write(bytes, 0, bytes.Length); 
      clientPipe.Flush(); 
      clientPipe.Dispose(); 
      clientPipe.Close(); 
     } 
    } 
} 
catch (Exception Ex) 
{ 
    System.Windows.MessageBox.Show(Ex.Message); 
} 

然後連接總是超時。奇怪的是,如果我嘗試寫使用CPP作爲這樣一個測試客戶端:

LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\TTCUIHELPER_SEND_TTC_RECEIVE"); 
const TCHAR* lpvMessage=L"QQQQ"; 

HANDLE hPipe = CreateFile( 
    lpszPipename, // pipe name 
    GENERIC_READ | // read and write access 
    GENERIC_WRITE, 
    0,    // no sharing 
    NULL,   // default security attributes 
    OPEN_EXISTING, // opens existing pipe 
    0,    // default attributes 
    NULL);   // no template file 

// Break if the pipe handle is valid. 

DWORD cbWritten; 
DWORD cbToWrite = (lstrlen(lpvMessage)+1)*sizeof(TCHAR); 
_tprintf(TEXT("Sending %d byte message: \"%s\"\n"), cbToWrite, lpvMessage); 

BOOL fSuccess = WriteFile( 
    hPipe,     // pipe handle 
    lpvMessage,    // message 
    cbToWrite,    // message length 
    &cbWritten,    // bytes written 
    NULL);     // not overlapped 

if (! fSuccess) 
{ 
    _tprintf(TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError()); 
    return -1; 
} 

然後就是完美的作品。我可能做錯了,它從CPP起作用,但不起作用。

回答

2

只需從管道名失去管道前綴,即只使用名稱本身:

"TTCUIHELPER_SEND_TTC_RECEIVE" 

的.NET NamedPipeClientStream類添加前綴你,當它在內部調用Windows API WriteFile的。

+0

將檢查出來,看看它是否工作 – Rahul