命名管道 支持网络之间不同进程的通信,和socket类似,如果要传输的数据量大,可以用命名管道
1.创建命名管道
/1 创建一个命名管道
LPCTSTR szPipeName = TEXT("\\\\.\\pipe\\mypipe");
hNamedPipe = CreateNamedPipe(szPipeName,
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE, 1, 1024, 1024, 0, NULL);
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
TRACE("CreateNamedhPipe failed with %d\n", GetLastError());
MessageBox(_T("创建命名管道失败"));
return;
}
2.等待客户端连接
3.给服务端添加读写按钮,这里直接传入命名管道的句柄就行
if (!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1, &dwWrite, NULL))
if (!ReadFile(hNamedPipe, szBuf, 100, &dwRead, NULL))
4.在客户端创建连接按钮
LPCTSTR szNamedPipeName = TEXT("\\\\.\\pipe\\mypipe");
if (0 == WaitNamedPipe(szNamedPipeName, NMPWAIT_WAIT_FOREVER))
{
MessageBox(_T("当前没有可以利用的管道"));
return;
}
hNamedPipe =
CreateFile(szNamedPipeName, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
TRACE("CreateFile failed with %d\n", GetLastError());
MessageBox(_T("打开命名管道失败!"));
hNamedPipe = NULL;
return;
}
注意:这里的sznamepipname的名字要和服务端的管道名字一样,创建一个文件句柄,用hnamepip接收,而一个关键参数就是命名管道的名字
,5.在客户端读写操作
if (!ReadFile(hNamedPipe, szBuf, 100, &dwRead, NULL))
if (!WriteFile(hNamedPipe, szBuff, strlen(szBuff + 1), &dwwrite, NULL))
这里 写文件的大小必须是字符串的大小,而读文件的大小是其类型大小即可
这样命名管道就写好了