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字节以下。