C winapi 處理序間通訊(Named Pipe)。

來源:互聯網
上載者:User

標籤:發送資訊   efi   處理序間通訊   class   cal   資料   編寫   sed   soft   

要求實現:
  • 用具名管道的相關知識及函數,分別編寫伺服器處理序和用戶端進程程式。
  • 要求伺服器處理序和用戶端進程程式能夠通過互相傳送資料。
  • 當伺服器處理序和用戶端進程中的任何一端輸入“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)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.