• 管道通信实例(A程序作为服务器,不断从B程序接收数据,并发送到C程序中)



    A程序作为服务器,不断从B程序接收数据,并发送到C程序中:
    #include <stdio.h>
    #include <conio.h>
    #include <tchar.h>
    #include <Windows.h>
    #include <process.h>
    #include <stdlib.h>
    const char *pStrPipeNameGet = "\\.\pipe\Name_pipe_demon_get";
    const char *pStrPipeNameSend = "\\.\pipe\Name_pipe_demon_send";
    const int BUFFER_MAX_LEN = 1024;
    char buf[BUFFER_MAX_LEN];
    DWORD dwLen;
    HANDLE get, mSend, mutex;
    LPCRITICAL_SECTION cs;
    WCHAR* toWChar(const char *c)
    {
    WCHAR wszClassName[256];
    memset(wszClassName, 0, sizeof(wszClassName));
    MultiByteToWideChar(CP_ACP, 0, c, strlen(c) + 1, wszClassName,
    sizeof(wszClassName) / sizeof(wszClassName[0]));
    return wszClassName;
    }
    void beginGetThread(PVOID p)
    {
    printf("服务器Get ");
    printf("等待连接...... ");
    HANDLE hPipe = CreateNamedPipe(toWChar(pStrPipeNameGet),
    PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
    PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
    if (ConnectNamedPipe(hPipe, NULL) != NULL)//等待连接。
    {
    printf("连接成功,开始接收数据 ");
    while (true)
    {
    WaitForSingleObject(mutex, INFINITE);
    EnterCriticalSection(cs);//接收客户端发送的数据
    ReadFile(hPipe, buf, BUFFER_MAX_LEN, &dwLen, NULL);
    printf("接收到来自A的数据长度为%d字节 ", dwLen);
    printf("具体数据内容如下:");
    int bufSize;
    for (bufSize = 0; bufSize < (int)dwLen; bufSize++)
    {
    putchar(buf[bufSize]);
    }
    LeaveCriticalSection(cs);
    Sleep(500);
    ReleaseSemaphore(mutex, 1, NULL);
    putchar(' ');
    }
    }
    else
    {
    printf("连接失败 ");
    }
    DisconnectNamedPipe(hPipe);
    CloseHandle(hPipe);//关闭管道
    }
    void beginSendThread(PVOID p)
    {
    printf("服务器Send ");
    printf("等待连接...... ");
    HANDLE hPipe = CreateNamedPipe(toWChar(pStrPipeNameSend),PIPE_ACCESS_DUPLEX,
    PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
    PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
    if (ConnectNamedPipe(hPipe, NULL) != NULL)//等待连接。
    {
    printf("连接成功,开始发送缓冲区数据至B ");
    while (true)
    {
    WaitForSingleObject(mutex, INFINITE);
    EnterCriticalSection(cs);
    WriteFile(hPipe, buf, (int)dwLen, &dwLen, NULL);
    LeaveCriticalSection(cs);Sleep(500);
    ReleaseSemaphore(mutex, 1, NULL);
    }
    }
    else
    {
    printf("连接失败 ");
    }
    DisconnectNamedPipe(hPipe);
    CloseHandle(hPipe);//关闭管道
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    cs = (LPCRITICAL_SECTION)malloc(sizeof(LPCRITICAL_SECTION));
    InitializeCriticalSection(cs);
    mutex = CreateSemaphore(NULL, 1, 1, TEXT("mutex"));
    _beginthread(beginGetThread, NULL, NULL);
    _beginthread(beginSendThread, NULL, NULL);
    Sleep(INFINITE);DeleteCriticalSection(cs);
    return 0;
    }

    B程序不断接收从键盘输入的数据,数据以回车结束,并发送给A
    #include <stdio.h>
    #include <tchar.h>
    #include <Windows.h>
    #include <conio.h>
    const char *pStrPipeName = "\\.\pipe\Name_pipe_demon_get";
    const int BUFFER_MAX_LEN = 1024;
    char buf[BUFFER_MAX_LEN];
    int _tmain(int argc, _TCHAR* argv[])
    {
    printf("按任意键以开始连接Get ");
    _getch();
    printf("A开始等待...... ");
    if (!WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER))
    {
    printf("Error! 连接Get失败 ");
    return 0;
    }
    HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_WRITE, 0,NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    while (true)
    {
    printf("请输入要向服务端发送的数据,回车键结束,最大1024个字节 ");
    DWORD dwLen = 0;
    int bufSize;
    for (bufSize = 0; bufSize < BUFFER_MAX_LEN; bufSize++)
    {
    buf[bufSize] = getchar();
    if (buf[bufSize] == ' ') break;
    }//向服务端发送数据
    if (WriteFile(hPipe, buf, bufSize, &dwLen, NULL))
    {
    printf("数据写入完毕共%d字节 ", dwLen);
    }
    else
    {
    printf("数据写入失败 ");
    }
    Sleep(1000);
    }
    CloseHandle(hPipe);
    return 0;
    }

    C程序接收到从A发送来的数据,并转换成大写写入文件
    #include <stdio.h>
    #include <tchar.h>
    #include <Windows.h>
    #include <conio.h>
    const char *pStrPipeName = "\\.\pipe\Name_pipe_demon_send";
    const int BUFFER_MAX_LEN = 1024;
    char buf[BUFFER_MAX_LEN];
    DWORD dwLen = 0;
    int _tmain(int argc, _TCHAR* argv[])
    {
    printf("按任意键以开始连接Send ");
    _getch();
    printf("B开始等待...... ");
    if (!WaitNamedPipe(pStrPipeName, NMPWAIT_WAIT_FOREVER))
    {
    printf("Error! 连接Send失败 ");
    return 0;
    }
    HANDLE hPipe = CreateFile(pStrPipeName, GENERIC_READ, 0,NULL,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    while (true)
    {// 接收服务端发回的数据
    ReadFile(hPipe, buf, BUFFER_MAX_LEN, &dwLen, NULL);//读取管道中的内容(管道是一种特殊的文件)
    printf("接收服务端发来的信息,长度为%d字节 ", dwLen);
    printf("具体数据内容如下:");
    HANDLE hWrite = CreateFile(_T("data.txt"), GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    for (int j = 0; j <= (int )dwLen; j++)
    {
    putchar(buf[j]);
    buf[j] = toupper(buf[j]);
    }
    putchar(' ');
    SetFilePointer(hWrite, NULL, NULL, FILE_END);
    WriteFile(hWrite, buf, (int)dwLen, NULL, NULL);
    WriteFile(hWrite, " ", 1, NULL, NULL);
    CloseHandle(hWrite);
    Sleep(1000);
    }
    CloseHandle(hPipe);
    return 0;
    }

    http://www.qtcn.org/bbs/apps.php?q=diary&a=detail&did=2428&uid=176322

  • 相关阅读:
    ASP.NET Forms 身份验证概述
    JS中变量相关的细节分析
    document对象execCommand的命令参数介绍
    一点一点学ASP.NET之基础概念——HTTP运行期与页面执行模型
    读《大道至简》第一章有感
    读大道至简第二章有感
    课程作业2
    编写一个程序,用户输入两个数,求其加减乘除,并用消息框显示计算结果。
    201920201 20209324《Linux内核原理与分析》第一周作业
    jQuery Plugins
  • 原文地址:https://www.cnblogs.com/findumars/p/6813781.html
Copyright © 2020-2023  润新知