欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

windows命名管道编程注意事项

程序员文章站 2022-05-08 17:05:29
...

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;即可解决这种问题。

相关标签: 管道