文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows平台进程间通信: 命名管道

Windows平台进程间通信: 命名管道

时间:2010-09-02  来源:kgisme170

        Windows平台的命名管道,是UNC形式的一个地址,以"\\\\.\\pipe\\开头"(必须是这样)。服务进程当中,用CreateNamedPipe来创建一个命名管道。指定的消息类型如果是MESSAGE,那么传递的就是char[]字符串数组,如果是BYTE,那就是(void*)2进制类型。在客户端进程中,可以用CallNamedPipe来连接MESSAGE类型的管道,或者CreateFile+ReadFile/WriteFile来连接BYTE类型的管道。
        下面的例子当中,主程序等待客户程序写入一个hello!字符串,并打印出来。
1. 主服务程序:(控制台程序,没有"stdafx.h"的预编译头,所以需要pragma来导入需要的库文件。

#include<windows.h>
#include<winbase.h>
#include<stdio.h>
#pragma comment(lib, "Advapi32.lib")
#define BUFSIZE 1024
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL fork(char* sCommandLine){//用于创建客户端进程
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb=sizeof(STARTUPINFO);
    return CreateProcess(NULL,sCommandLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
}
int main(void){
    DWORD dwWrite;
    HANDLE hpipe=CreateNamedPipe("\\\\.\\pipe\\mypipe",PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE|PIPE_WAIT,
        1,0,0,2000,NULL);
    if(!hpipe || hpipe==INVALID_HANDLE_VALUE){exit(1);}
    if(!fork("testLoop")){exit(3);}
    BOOL bConnected = ConnectNamedPipe(hpipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
    if(!WaitForSingleObject(pi.hProcess,2000)){exit(4);}
    DWORD dwRead;
    char buf[8];
    ReadFile(hpipe,buf,sizeof(buf),&dwRead,NULL);
    WriteFile((HANDLE)STD_OUTPUT_HANDLE,buf,strlen(buf),&dwWrite,NULL);
    if(!DisconnectNamedPipe(hpipe))exit(5);
    CloseHandle(hpipe);
    return 0;
}

2. 客户端程序:

#include"stdafx.h"
#include<windows.h>
#include<winbase.h>
#include<stdio.h>
#define BUFSIZE 8
char buf[BUFSIZE]="hello!\n";
int main(void){
    DWORD dwRead;
    BOOL ret=CallNamedPipe("\\\\.\\pipe\\mypipe",buf,sizeof(buf),NULL,0,&dwRead,0);
    return 0;
}


主程序运行,大概会有1-2秒的延时,然后打印hello!。
       如果是Win32应用程序,那么可以对HWND对象使用OpenClipborad()来使用Windows的全局剪贴版,这样更加方便。如果要用管道进行单向通信,那么可以用mailslot替代Namedpipe,它也是一种UNC资源,用法几乎一样。既然是UNC地址,它们都是可以跨越Windows主机的。但是必须在同一个Domain里面。邮槽通常是用来发送广播消息的。不同点,命名管道是TCP跨越,而邮槽是UDP数据报。
       UNC的格式是\servername\sharename\directory\filename。
       这上面用.表明是本机
,sharename是资源类型,是pipe.邮槽的话写成"\\\\.\\mailslot\\sample_mailslot"。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载