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字節的使用。
我感染的進展是否正確?
我不確定OP是否希望管道緩衝區更大,或者他實際上是在談論消息大小。 80K可以在一個WriteFile調用中通過管道發送,而不管CreateNamedPipe中的緩衝區大小是通過了什麼。在Windows XP中,一次寫入64K左右的限制是有限的,這可能是OP發現的。順便說一句,我希望我能兩次爲「睡覺真是浪費時間」而努力。 –
@MillieSmith我引用的文檔非常清晰。我不明白寫入超過緩衝區大小的可能性如何,除非它處於欺騙因素之內。 – EJP
文檔是關於內部緩衝區有多大,而不是一次可以發送多少數據。具有斷言的示例服務器:http://pastebin.com/ciJj8BDX,示例客戶端斷言:http://pastebin.com/UTjZ2X8f。直到發送完所有數據後,WriteFile調用纔會返回(儘管仍需要FlushFileBuffers調用)。這也適用於重疊的IO,也適用於從客戶端到服務器的寫入。啓動服務器,然後啓動客戶端。我懶得等待在客戶端創建命名管道。 –