2016-12-11 6 views
0

私のプロジェクトにバグがあり、それが大きなパイプであることがわかりました。Windowsの名前付きパイプ最大制限

process1は約80 KBのメッセージを生成し、その標準出力にnamepdpipeを添付しています。

プロセス2が指定されたパイプからメッセージを読み取った後、メッセージが不完全であることがわかりました。

擬似コードは、名前付きパイプに関する何らかの情報グーグル後

char buffer[4096] ; 
string msg ; 
while(!namedpipe.isEmpty()) { 
    int length = namedPipe.read(buffer, 4096) ; 
    msg.append(buffer, length) ; 
} 

、そのようなもので、私は、名前付きパイプは、65535バイトに制限され見つかりました。

80KBのメッセージは制限を超えます。

しかし、私は読書の前にスリープ(1000)を挿入します。

char buffer[4096] ; 
string msg ; 
while(!namedpipe.isEmpty()) { 
    Sleep(1000) ; 
    int length = namedPipe.read(buffer, 4096) ; 
    msg.append(buffer, length) ; 
} 

メッセージはOKです。

私は眠っている瞬間に、システムが指定されたパイプのメモリを要求していると思います。

したがって、namedpipeは65535バイトの使用を保証します。

私が推測した進歩は正しいですか?

答えて

0

isEmpty()は、メッセージ終了のインジケータではありません。

予想されるメッセージ長に達すると、終了するようにループ終了条件を変更する必要があります。

パイプ内の最大データ量は、作成時にnInBufferSizeおよびnOutBufferSizeパラメータを使用してCreateNamedPipeに定義されます。そこに備考欄を参照してください。

睡眠は文字通り時間の無駄です。

+0

OPがパイプバッファーを大きくするか、実際にメッセージサイズについて話しているかどうかはわかりません。 80Kは、CreateNamedPipeのバッファサイズに渡された内容に関係なく、1つのWriteFile呼び出しでパイプを介して送信できます。以前は、Windows XPで64Kを1回書くのに限界がありましたが、それはOPが見つけたものかもしれません。私は "睡眠は文字通り時間の無駄です"という意味で2回upvoteできますことを願っています。 –

+0

@MillieSmith私が引用したドキュメントはかなり明確です。私はファッジファクタの範囲内にない限り、書き込みがバッファサイズを超えてどのように可能であるかはわかりません。 – EJP

+0

ドキュメントは内部バッファの大きさであり、一度に何通りのデータを送ることができるかではありません。アサートを伴うサンプル・サーバー:http://pastebin.com/ciJj8BDX、アサートを伴うサンプル・クライアント:http://pastebin.com/UTjZ2X8f。 WriteFile呼び出しは、すべてのデータが送信されるまで(FlushFileBuffers呼び出しはまだ必要ですが)返されます。オーバーラップIOでも機能し、クライアントからサーバーへの書き込みも機能します。サーバーを起動してから、クライアントを起動します。私は、あまりにも怠惰で、名前付きパイプがクライアントで作成されるのを待つのが適切でした。 –

関連する問題