命名管道的一个简单例子

#include "stdafx.h"
#include "../include/public.h"

int main(int argc, char* argv[])
{
    char    szPipe[250]    = ".//pipe//sms";

    //创建服务端只读命名管道
    HANDLE    hPipe    = CreateNamedPipe( szPipe, PIPE_ACCESS_INBOUND,
        PIPE_TYPE_BYTE|PIPE_WAIT, 100, 0, 0, 150, NULL );
    if ( hPipe==HANDLE(-1) ){

        cerr << "无法创建命名管道 " << szPipe << endl;
        return 1;

    }
    cout << "命名管道 " << szPipe << " 创建完毕" << endl;

    //读取信息
    if ( !ConnectNamedPipe( hPipe, NULL ) ){

        cerr << "无法连接命名管道 " << szPipe << endl;
        CloseHandle( hPipe );
        return 1;

    }

    while ( 1 ){

        char    szMsg[512]    = "";
        DWORD    dwSize        = 512,
                dwBytesRead    = 0;

        OVERLAPPED    overlappedInfo;
        memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );

        overlappedInfo.Offset        = 0;
        overlappedInfo.OffsetHigh    = 0;

        HANDLE    hEvent                = CreateEvent( 0, TRUE, FALSE, 0 );
        overlappedInfo.hEvent        = hEvent;

        if ( !ReadFile( hPipe, szMsg, dwSize, &dwBytesRead, &overlappedInfo ) &&
            GetLastError()==ERROR_IO_PENDING ) {

            do {

                cout << endl << "等待读取..." << endl;

            }while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );

            /*
            cerr << "无法读取命名管道 " << szPipe << " 的消息" << endl;
            CloseHandle( hPipe );
            return 1;
            */

        }
        
        cout << szMsg << endl;
        Sleep( 500 );

    }//while

    return 0;
}

客户端
// NamedPipeClient.cpp : Defines the entry point for the console application.
// 命名管道客户端

#include "stdafx.h"
#include "../include/public.h"

int main(int argc, char* argv[])
{
    char    szMachine[250]    = "";
    char    szPipe[512]        = "";

    cout << "输入主机名称:";
    cin >> szMachine;

    sprintf( szPipe, "%s//pipe//sms", szMachine );

    HANDLE    hPipe    = CreateFile( szPipe, GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if ( hPipe==HANDLE(-1) ){

        char    szErr[256]    = "";
        DWORD    dwErr        = GetLastError();
        GetErrorMsg( szErr, 256 );

        cerr << "打开命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << ":" << szErr << endl;
        return 1;

    }

    while ( 1 ){

        char    szMsg[80]        = "test string";
        DWORD    dwSize            = 80,
                dwBytesWritten    = 0;

        cout << "输入消息(50字符):";
        cin >> szMsg;

        OVERLAPPED    overlappedInfo;
        memset( &overlappedInfo, 0, sizeof(OVERLAPPED) );

        overlappedInfo.Offset        = 0;
        overlappedInfo.OffsetHigh    = 0;

        HANDLE    hEvent                = CreateEvent( 0, TRUE, FALSE, 0 );
        overlappedInfo.hEvent        = hEvent;

        if ( !WriteFile( hPipe, szMsg, strlen( szMsg ) + 1, &dwBytesWritten, &overlappedInfo ) &&
            GetLastError()==ERROR_IO_PENDING ){

            do {

                cout << endl << "等待写入..." << endl;

            }while ( WaitForSingleObject( overlappedInfo.hEvent, 500 )==WAIT_TIMEOUT );

            //cerr << "写入命名管道 " << szPipe << " 失败: 0x" << hex << GetLastError() << endl;
            //CloseHandle( hPipe );
            //return 1;

        }

        Sleep( 1000 );
        
    }            
    return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值