windows命名管道编程注意事项
1.创建命名管道
HANDLE WINAPI CreateNamedPipe(
__in LPCTSTR lpName,
__in DWORD dwOpenMode,
__in DWORD dwPipeMode,
__in DWORD nMaxInstances,
__in DWORD nOutBufferSize,
__in DWORD nInBufferSize,
__in DWORD nDefaultTimeOut,
__in LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
这里面的nMaxInstances表示一个管道名称对应的最大实例数量,msdn上面PIPE_UNLIMITED_INSTANCES表示无限制数量的意思,对应的值是255,所以之前一直以为一个管道名称最多对应255个管道实例,后来发现不是,几千,几万个都能创建成功。
2.管道读写
如下面的代码所示,ReadFile从管道里面读取内容,注意,最后一句,buf[rLen]=0,一定是要的,否则会出现问题。
char buf[1000] = {0};
DWORD rLen = 0;
if (!ReadFile(hPipe, buf, sizeof(buf), &rLen, NULL)) //接受客户端发送数据
{
err = ::GetLastError();
LOG_ERROR("ReadFile failed, errorcode is %d", err);
}
else
{
LOG_DEBUG("ReadFile msg is %s, rLen is %u", buf, rLen);
**buf[rLen] = 0;**
}
考虑这样一种场景,第一次,管道写方写进去500个字节,管道读取方读到500个字节。
第二次,管道写方写进去100个字节,但是只覆盖了前面的500个字节的前100个字节,后面的400字节还是之前的内容,所以直接ReadFile(hPipe, buf, sizeof(buf), &rLen, NULL),读取到的buf还是500个字节,其中后400个字节跟第一次读取的是一样的,这就产生了问题,因为我们期望buf打印出来的只有100个字节,此时就需要用到rLen,这个值就是100,用buf[rLen] = 0;即可解决这种问题。
上一篇: 有名管道FIFO示例
下一篇: 进程间通信——匿名管道和命名管道
推荐阅读