2016-12-11 38 views
0

在我的項目中發生了錯誤,並且我發現它可能是windows namedpipe傳遞的大消息。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) ; 
} 

後谷歌有關namedpipe的一些信息,我發現namedpipe爲65535字節的限制。

80KB消息將超出限制。

但是當我在讀取之前插入睡眠(1000)。

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

該消息是確定和完整的。

我覺得在睡覺的時候,系統會爲namedpipe請求內存。

所以namedpipe只能確保65535字節的使用。

我感染的進展是否正確?

回答

0

isEmpty()不是消息指示符的結束。

當達到預期的消息長度時,應該更改循環終止條件以終止。

管道中的最大數據量在創建時通過nInBufferSizenOutBufferSize參數設置爲CreateNamedPipe。見那裏的備註部分。

睡覺實際上是浪費時間。

+0

我不確定OP是否希望管道緩衝區更大,或者他實際上是在談論消息大小。 80K可以在一個WriteFile調用中通過管道發送,而不管CreateNamedPipe中的緩衝區大小是通過了什麼。在Windows XP中,一次寫入64K左右的限制是有限的,這可能是OP發現的。順便說一句,我希望我能兩次爲「睡覺真是浪費時間」而努力。 –

+0

@MillieSmith我引用的文檔非常清晰。我不明白寫入超過緩衝區大小的可能性如何,除非它處於欺騙因素之內。 – EJP

+0

文檔是關於內部緩衝區有多大,而不是一次可以發送多少數據。具有斷言的示例服務器:http://pastebin.com/ciJj8BDX,示例客戶端斷言:http://pastebin.com/UTjZ2X8f。直到發送完所有數據後,WriteFile調用纔會返回(儘管仍需要FlushFileBuffers調用)。這也適用於重疊的IO,也適用於從客戶端到服務器的寫入。啓動服務器,然後啓動客戶端。我懶得等待在客戶端創建命名管道。 –