1. 程式人生 > >C winapi 進程間通信(Named Pipe)。

C winapi 進程間通信(Named Pipe)。

winapi none code 技術分享 seh adb eth rcm fun

要求實現

  • 用命名管道的相關知識及函數,分別編寫服務器進程和客戶端進程程序。
  • 要求服務器進程和客戶端進程程序能夠通過互相傳送數據。
  • 當服務器進程和客戶端進程中的任何一端輸入“end”時,結束會話。

寫了半天,發現如果只用單個管道的話,非常的困難,進程總是卡住,感覺難點在於服務器進程怎麽主動地像客戶端進程發送信息,研究了一天還是未解決這個問題。。。

最後是寫了個雙管道的(每個進程都有各自的服務器和客戶端)來實現的,雖然和要求可能有所出入。。。

技術分享圖片
#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\\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; }
1.c 技術分享圖片
#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)。