C winapi 進程間通信(Named Pipe)。
阿新 • • 發佈:2017-12-26
winapi none code 技術分享 seh adb eth rcm fun
要求實現:
- 用命名管道的相關知識及函數,分別編寫服務器進程和客戶端進程程序。
- 要求服務器進程和客戶端進程程序能夠通過互相傳送數據。
- 當服務器進程和客戶端進程中的任何一端輸入“end”時,結束會話。
寫了半天,發現如果只用單個管道的話,非常的困難,進程總是卡住,感覺難點在於服務器進程怎麽主動地像客戶端進程發送信息,研究了一天還是未解決這個問題。。。
最後是寫了個雙管道的(每個進程都有各自的服務器和客戶端)來實現的,雖然和要求可能有所出入。。。
#include <Windows.h> #include <stdio.h> HANDLE hPipe, hInput;1.cchar writeBuffer[256]; char readBuffer[256]; DWORD cbRead = 100; BOOL isSelf = false; BOOL fConnected = false; BOOL isExit = false; DWORD WINAPI mThreadFunc(LPVOID lpParam) { while (true) { gets_s(writeBuffer, 256); if (WaitNamedPipe("\\\\.\\pipe\\test2", 1000)) { CallNamedPipe("\\\\.\\pipe\\test2", writeBuffer, 256, readBuffer, 256, &cbRead, 20000); printf("%s\n", readBuffer); if (strcmp(writeBuffer, "end") == 0) { exit(-1); } } else { if (GetLastError() == ERROR_FILE_NOT_FOUND) { printf("錯誤:進程二沒在運行!\n"); } } } } int main() { printf("我是進程一。\n\n"); hPipe = CreateNamedPipe( "\\\\.\\pipe\\test1", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 3, 512, 512, 0, NULL); hInput = CreateThread(NULL, 0, mThreadFunc, NULL, 0, NULL); CloseHandle(hInput); while (!isExit) { fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { ReadFile(hPipe, readBuffer, 256, 0, NULL); printf("進程二: %s\n", readBuffer); WriteFile(hPipe, "進程一: 我收到了!", 256, 0, NULL); DisconnectNamedPipe(hPipe); if (strcmp(readBuffer, "end") == 0) { isExit = true; } } } CloseHandle(hPipe); return 0; }
#include <Windows.h> #include <stdio.h> HANDLE hPipe, hInput; char writeBuffer[256]; char readBuffer[256]; DWORD cbRead = 100; BOOL isSelf = false; BOOL fConnected = false; BOOL isExit = false; DWORD WINAPI mThreadFunc(LPVOID lpParam) { while (true) { gets_s(writeBuffer, 256); if (WaitNamedPipe("\\\\.\\pipe\\test1", 1000)) { CallNamedPipe( "\\\\.\\pipe\\test1", writeBuffer, 256, readBuffer, 256, &cbRead, 20000); printf("%s\n", readBuffer); if (strcmp(writeBuffer, "end") == 0) { exit(-1); } } else { if (GetLastError() == ERROR_FILE_NOT_FOUND) { printf("錯誤:進程一沒在運行!"); } } } } int main() { printf("我是進程二。\n\n"); hPipe = CreateNamedPipe( "\\\\.\\pipe\\test2", PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 3, 512, 512, 0, NULL); hInput = CreateThread(NULL, 0, mThreadFunc, NULL, 0, NULL); CloseHandle(hInput); while (!isExit) { fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { ReadFile(hPipe, readBuffer, 256, 0, NULL); printf("進程一: %s\n", readBuffer); WriteFile(hPipe, "進程二: 我收到了!", 256, 0, NULL); DisconnectNamedPipe(hPipe); if (strcmp(readBuffer, "end") == 0) { isExit = true; } } } CloseHandle(hPipe); return 0; }2.c
C winapi 進程間通信(Named Pipe)。