四种进程间通信方式简介与比较

CreatePipe(&m_hRead, &m_hWrite, &sa, 0)创建匿名管道
CreateProcess("..//Child//debug//Child.exe", NULL, NULL, NULL,TRUE,
        0, NULL, NULL, &sui, &pi)通过STARTUPINFO结构体sui将父进程匿名管道读写句柄传递给子进程 sui.hStdInput = m_hRead;
    sui.hStdOutput = m_hWrite;
同样,通过ReadFile和WriteFile从管道中读取、写入数据

命名管道
服务器端:
hPipe=CreateNamedPipe("////.//pipe//MyPipe",
        PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
        0,1,1024,1024,0,NULL); //创建命名管道
HANDLE hEvent;
    hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
    OVERLAPPED ovlap;
    ZeroMemory(&ovlap,sizeof(OVERLAPPED));
    ovlap.hEvent=hEvent;
ConnectNamedPipe(hPipe,&ovlap)//等待客户端连接
WaitForSingleObject(hEvent,INFINITE)//等待事件发生
然后通过readfile和writefile从管道中读取数据

客户机端:
WaitNamedPipe("////.//pipe//MyPipe",NMPWAIT_WAIT_FOREVER) //连接管道
hPipe=CreateFile("////.//pipe//MyPipe",GENERIC_READ | GENERIC_WRITE,
        0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开已经存在的管道
然后通过readfile和writefile从管道中读取数据

油槽的服务器端只能接收数据,客户端只能发送数据,由于其基于广播通信体系,所以可以利用油槽,编码多个服务器端和一个客户端来简单实现一个一对多的网络系统。
服务器端:
    HANDLE hMailslot = CreateMailslot("////.//mailslot//MyMailslot", 0,
        MAILSLOT_WAIT_FOREVER, NULL);  //创建油槽
ReadFile(hMailslot, buf, 100, &dwRead, NULL)  //读取数据
客户端:
hMailslot = CreateFile("////.//mailslot//MyMailslot", GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  //打开油槽
WriteFile(hMailslot, buf, strlen(buf)+1, &dwWrite, NULL)  //写入数据

剪贴板和匿名管道只能实现同一台机器上两个进程间的通信,不能实现跨网络的通信;而命名管道和油槽则两者都可以实现,对于油槽还可以实现一对多的通信,而命名管道只能是一个点对点的通信。但是油槽发送信息较少,要在424字节以下。

你可能感兴趣的:(网络,服务器,File,null,Access)