现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

命名管道(Named Pipes)通信学习

2012-08-21 06:05 工业·编程 ⁄ 共 2735字 ⁄ 字号 评论 1 条

学习内容出处:《Windows网络编程技术》第4章命名管道。
命名管道的基本原理:利用微软网络提供者(MSNP)重定向器。
特点

  • 跨网络。
  • 可靠的传输。
  • 单向或双向数据通信。

服务端源码,PipeServer.cpp。

// PipeServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

//最多创建实例数
#define NUM_PIPES 1
//管道名称
#define PIPE_NAME _T("\\\\.\\Pipe\\Jim")

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE PipeHandle = NULL;
    DWORD BytesRead = 0;
    TCHAR buffer[256] = {0};

    PipeHandle = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_BYTE|PIPE_READMODE_BYTE, NUM_PIPES, 0, 0, 1000, NULL);
    if (PipeHandle == INVALID_HANDLE_VALUE)
    {
        printf("CreateNamedPipe failed with error %d\n", GetLastError());
        return 0;
    }

    printf("Server is now running\n");

    //一直等待,直到客户端连接
    if (ConnectNamedPipe(PipeHandle, NULL) == 0)
    {
        printf("ConnectNamedPipe failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return 0;
    }

    //发送消息到客户端
    DWORD BytesWritten;
    if (WriteFile(PipeHandle, "Server Call you", 15, &BytesWritten, NULL) == 0)
    {
        printf("WriteFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return 0;
    }

    //等待客户端消息
    if (ReadFile(PipeHandle, buffer, sizeof(buffer), &BytesRead, NULL) <= 0)
    {
        printf("ReadFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return 0;
    }

    printf("%.*s\n", BytesRead, buffer);

    if (DisconnectNamedPipe(PipeHandle) == 0)
    {
        printf("DisconnectNamedPipe failed with error %d\n", GetLastError());
        return 0;
    }

    CloseHandle(PipeHandle);

    return 0;
}

客户端源码,PipeClient.cpp。

// PipeClient.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>

//管道名称
#define PIPE_NAME _T("\\\\.\\Pipe\\Jim")

int _tmain(int argc, _TCHAR* argv[])
{
    if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) == 0)
    {
        printf("WaitNamedPipe failed with error %d\n", GetLastError());
        return 0;
    }

    //Create the named pipe file handle
    HANDLE PipeHandle = CreateFile(PIPE_NAME, GENERIC_READ|GENERIC_WRITE, 0,
        (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
    if (PipeHandle == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile failed with error %d\n", GetLastError());
        return 0;
    }

    //接受服务端消息
    DWORD BytesRead = 0;
    TCHAR buffer[256] = {0};
    if (ReadFile(PipeHandle, buffer, sizeof(buffer), &BytesRead, NULL) <= 0)
    {
        printf("ReadFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return 0;
    }
    printf("%.*s\n", BytesRead, buffer);

    //发送消息到服务端
    DWORD BytesWritten;
    if (WriteFile(PipeHandle, "Get it, sir!", 12, &BytesWritten, NULL) == 0)
    {
        printf("WriteFile failed with error %d\n", GetLastError());
        CloseHandle(PipeHandle);
        return 0;
    }

    printf("Wrote %d bytes\n", BytesWritten);
    CloseHandle(PipeHandle);

    return 0;
}

目前有 1 条留言    访客:0 条, 博主:0 条 ,引用: 1 条

    外部的引用: 1 条

    • Windows管道(Pipe)重定向stdout,stderr,stdin | 求索阁

    给我留言

    留言无头像?