在进程间通讯时使用了命名管道,在这里做个记录。开始想使用共享内存,但是由于两个进程数据通讯速度快数据量大,担心共享内存会存满或者覆盖数据。因此就使用了管道。
管道的命令格式 “\.\pipe\管道名”
服务端:
1、创建命名管道:
m_hHandle = CreateNamedPipe(A2T(m_szFifoName),
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_WAIT,
PIPE_UNLIMITED_INSTANCES,
m_nOutSize,
m_nInSize,
0,
NULL
);
if (m_hHandle == INVALID_HANDLE_VALUE)
{
}
第三个参数管道模式,标识数据以什么形式写入管道和对管道的的等待模式。
2、等待连接:
if (ConnectNamedPipe(m_hHandle, NULL) == 0)
{
}
在这一步由于第一步设置了管道是PIPE_WAIT阻塞模式,因此程序执行到这会阻塞,直到有客户端连接进来。
客户端:
1、检测管道是否可以用:
if (WaitNamedPipe(A2T(szBuffer), NMPWAIT_WAIT_FOREVER) == 0)
{
}
2、当检测到该命名管道可用就打开管道
m_hHandle = CreateFile(A2T(szBuffer),
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (m_hHandle == INVALID_HANDLE_VALUE)
{
return false;
}
注意打开的是已存在的管道,因此第5个参数是OPEN_EXISTING代表打开已存在的意思。
到这一步打开成功后服务端的第2步就结束阻塞继续执行。
下面就是读写管道。
BOOL
WINAPI
ReadFile(
_In_ HANDLE hFile,
_Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
BOOL
WINAPI
WriteFile(
_In_ HANDLE hFile,
_In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,
_In_ DWORD nNumberOfBytesToWrite,
_Out_opt_ LPDWORD lpNumberOfBytesWritten,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
ReadFile():
1、当管道中没有数据时,该函数会阻塞。
2、当管道另一端关闭,该函数会立即返回0。
WriteFile():
1、当管道中内存已经占满,该函数会阻塞,另一端读出后空出空间才会解除该函数阻塞状态。
2、但管道另一端关闭,该函数返回0。