我想開始使用命名管道工作,我將需要使用它們在未來我的一個項目。如何使用命名管道(C++服務器,C#客戶端)
目前我有等待,直到客戶端連接,併發送經測試消息一個C++服務器。我大致遵循這個tutorial開始。相關代碼如下:
#define MESSAGE L"TestMessage"
HANDLE hnamedPipe = INVALID_HANDLE_VALUE;
hnamedPipe = CreateNamedPipe(
L"\\\\.\\pipe\\testpipe",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|
PIPE_READMODE_MESSAGE|
PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
1024,
1024,
NMPWAIT_USE_DEFAULT_WAIT,
NULL);
if(hnamedPipe == INVALID_HANDLE_VALUE)
{
cout << "Failed" << endl;
}
while(true)
{
cout<< "Waiting for client"<< endl;
if(!ConnectNamedPipe(hnamedPipe,NULL))
{
if(ERROR_PIPE_CONNECTED != GetLastError())
{
cout << "FAIL"<< endl;
}
}
cout<<"Connected!"<<endl;
//Send over the message
wchar_t chResponse[] = MESSAGE;
DWORD cbResponse,cbWritten;
cbResponse = sizeof(chResponse);
if(!WriteFile(
hnamedPipe,
chResponse,
cbResponse,
&cbWritten,
NULL))
{
wprintf(L"failiure w/err 0x%08lx\n",GetLastError);
}
cout<<"Sent bytes :)" << endl;
}
客戶端代碼(C#)低於:
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut))
{
while (true)
{
Console.WriteLine("Connecting to server...");
pipeClient.Connect();
Console.WriteLine("Connected :)");
Console.WriteLine(pipeClient.ReadByte());
pipeClient.Close();
Console.WriteLine("Closed");
}
}
在我已經得到了客戶端成功連接到服務器的時刻,它打印出的第一個字節。我想知道如何做兩件事情:
閱讀整個消息 - 我嘗試使用的StreamReader在pipeClient閱讀信息,但它無限期地掛在的ReadLine()。
連續發送了郵件 - 我希望服務器消息後發送消息給客戶端,這將在一次一個閱讀並打印出來。我有點無能IPC所以剛開始我試圖讓客戶端斷開並重新連接在一段時間(true)循環的服務器,而服務器在一段時間真正的循環在頂部總是等待前一個新的客戶端連接發送另一條消息。我試圖在上面的代碼中。
任何幫助,這將不勝感激。最終的目標是將圖像從服務器發送到客戶端。客戶端然後將它們實時打印到屏幕上。在我嘗試圖像數據之前,我想用簡單的字符串消息來處理這個問題。
編輯:
最後,我希望能夠從客戶端發送信息到服務器,表明它想獲得最新的圖像幀時,服務器將發送了最新的幀的客戶端將其再在屏幕上顯示。所以流程如下:
- 客戶端 - >服務器:指示客戶端需要最新的幀信息。 (很簡單,也許是1的無符號整數)
- 服務器 - >客戶端:最新的框架信息。 (存儲在一個字節數組RGB字節值640×480圖像)
- 客戶端:在顯示器上顯示的幀。
對於你的第一個問題,使用類似'StreamReader'(只有當你的消息是文本時才使用它)。 'StreamReader.ReadToEnd'將從流中讀取所有可用的數據。 – 2012-03-13 00:12:02
嗨,我試過了,但它一直等到C++服務器關閉之前纔打印出所有消息。最終,我希望能夠從客戶端向服務器發送一條消息,表明它想要獲取最新的圖像幀,然後服務器將發送最新的幀,然後客戶端將在屏幕上顯示該幀。 – Jkh2 2012-03-13 15:26:43