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

猜你喜欢

转载自blog.csdn.net/tusong86/article/details/106218529