我的项目中出现了错误,我发现它可能是通过windows namedpipe传递的大消息。
process1产生大约80 KB的消息,并且我有一个namepdpipe附加到它的标准输出。
在进程2从namedpipe读取消息后,我发现消息不完整。
伪代码就是这样,
char buffer[4096] ;
string msg ;
while( !namedpipe.isEmpty() ) {
int length = namedPipe.read(buffer, 4096) ;
msg.append(buffer, length) ;
}
在google上有关namedpipe的一些信息后,我发现namedpipe的限制为65535字节。
80KB的消息将超出限制。
但是当我在读取之前插入Sleep(1000)时。
char buffer[4096] ;
string msg ;
while( !namedpipe.isEmpty() ) {
Sleep(1000) ;
int length = namedPipe.read(buffer, 4096) ;
msg.append(buffer, length) ;
}
信息正常并完整。
我认为在睡眠时刻,系统会请求命名管道的内存。
因此namedpipe只能确保使用65535字节。
我所取得的进展是否正确?
答案 0 :(得分:0)
isEmpty()
不是消息指示符的结尾。
您应该将循环终止条件更改为在达到预期的消息长度时终止。
管道中的最大数据量在创建时通过nInBufferSize
和nOutBufferSize
参数定义到CreateNamedPipe
。请参阅那里的备注部分。
睡觉实际上是浪费时间。