2016-12-11 7 views
0

Es gibt Fehler tritt in meinem Projekt auf, und ich fand, dass es die große Nachricht sein könnte, die durch die Fenster namedpipe überschreitet.Windows namedpipe maximale Grenze

Die process1 produzieren etwa 80 KB Nachricht, und ich habe ein Namepdpipe an seine Standardausgabe anhängen.

Nachdem der Prozess 2 die Nachricht aus dem Namedpipe gelesen habe, fand ich die Nachricht unvollständig.

Der Pseudocode ist so,

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

Nachdem Google einige Informationen über die namedpipe ich die namedpipe ist Grenze in 65535 Byte gefunden.

Die 80KB Nachricht würde die Grenze überschreiten.

Aber wenn ich den Sleep (1000) vor dem Lesen einfügen.

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

Die Nachricht ist OK und abgeschlossen.

Ich denke, dass im schlafenden Moment das System den Speicher für das Namedpipe anfordert.

So würde das Namedpipe nur sicherstellen 65535 Byte zu verwenden.

Ist der Fortschritt korrekt?

Antwort

0

isEmpty() ist kein Ende der Nachrichtenanzeige.

Sie sollten die Schleifenbeendigungsbedingung so ändern, dass sie endet, wenn die erwartete Nachrichtenlänge erreicht ist.

Die maximale Datenmenge in der Rohrleitung wird zum Zeitpunkt der Erstellung über die Parameter nInBufferSize und nOutBufferSize zu CreateNamedPipe definiert. Siehe dort den Abschnitt "Bemerkungen".

Der Schlaf ist buchstäblich eine Zeitverschwendung.

+0

Ich bin mir nicht sicher, ob OP erwartet, dass der Pipe Buffer größer ist oder ob er tatsächlich über die Nachrichtengröße spricht. 80K können über eine Pipe in einem WriteFile-Aufruf gesendet werden, unabhängig davon, was für die Puffergrößen in CreateNamedPipe übergeben wurde. Es gab ein Limit für einen Schreibvorgang um 64K in Windows XP, und das könnte sein, was OP gefunden hat. Ich wünschte, ich könnte zweimal für "die Schläfer sind buchstäblich eine Verschwendung von Zeit" upvote übrigens. –

+0

@MillieSmith Die von mir zitierte Dokumentation ist ziemlich klar. Ich sehe nicht, wie es möglich ist, dass ein Schreibvorgang die Puffergröße überschreitet, es sei denn, es liegt innerhalb des Fudge-Faktors. – EJP

+0

Die Dokumentation gibt an, wie groß der interne Puffer ist und nicht, wie viele Daten gleichzeitig gesendet werden können. Beispielserver mit aktiviert: http://pastebin.com/ciJj8BDX, Beispiel-Client mit bestätigt: http://pastebin.com/UTjZ2X8f. Der WriteFile-Aufruf wird erst zurückgegeben, wenn alle Daten gesendet wurden (obwohl der FlushFileBuffers-Aufruf weiterhin benötigt wird). Dies funktioniert auch mit überlappender IO und funktioniert auch beim Schreiben von Client zu Server. Starten Sie den Server und dann den Client. Ich war zu faul, um richtig darauf zu warten, dass die Named Pipe im Client erstellt wurde. –

Verwandte Themen