2

我正在開發使用本地消息傳遞主機的Chrome擴展。 它在大多數情況下都有效,但是當我發送特定尺寸的消息時,我發現了一種奇怪的行爲。 當大小介於2560和2815字節(十六進制中的A00和AFF)之間時,消息似乎被丟棄。所有後續消息也沒有到達,這表明由於某種原因,流已被破壞。Chrome本地消息傳遞不接受特定大小的消息(Windows)

這裏是一個精簡的Python本地消息傳遞應用程序,其可被用來測試它:

import sys 
import struct 

def output(message): 
    encoded_message = message.encode('utf-8') 

    # Write message size. 
    sys.stdout.write(struct.pack('I', len(encoded_message))) 
    # Write the message itself. 
    sys.stdout.write(encoded_message) 
    sys.stdout.flush() 

if __name__ == "__main__": 
    output('{"type": "%s"}' % ('x'*2820)) 
    output('{"type": "%s"}' % ('x'*2560)) 

我收到的第一條消息,而不是第二個。

我看了一下Chrome repository中的代碼。功能,似乎是負責該功能,沒有什麼特別的:

void NativeMessageProcessHost::ProcessIncomingData(
    const char* data, int data_size) { 
    DCHECK_CURRENTLY_ON(content::BrowserThread::IO); 

    incoming_data_.append(data, data_size); 

    while (true) { 
    if (incoming_data_.size() < kMessageHeaderSize) 
     return; 

    size_t message_size = 
     *reinterpret_cast<const uint32*>(incoming_data_.data()); 

    if (message_size > kMaximumMessageSize) { 
     LOG(ERROR) << "Native Messaging host tried sending a message that is " 
       << message_size << " bytes long."; 
     Close(kHostInputOuputError); 
     return; 
    } 

    if (incoming_data_.size() < message_size + kMessageHeaderSize) 
     return; 

    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 
     base::Bind(&Client::PostMessageFromNativeProcess, weak_client_ui_, 
      destination_port_, 
      incoming_data_.substr(kMessageHeaderSize, message_size))); 

    incoming_data_.erase(0, kMessageHeaderSize + message_size); 
    } 
} 

有沒有人有任何想法可能在這裏發生?

更新

我已經經歷了Windows 7和Windows 8.1的64個版本的這個問題。

我試圖上穩定,β和DEV通道鉻64位 - 版本37,38和39 我還試圖穩定鉻32位

我使用Python 2.7.7的32位版本和PyInstaller 2.1爲本地消息傳遞主機創建一個可執行文件。

+0

適合我的工作(Linux)。你在使用哪種操作系統?而你的字節計算有點偏離。在你的問題中,你提到了'x'的數量,而輸出還包含其他字符('{「type」:...}')。 – 2014-10-02 18:30:04

+0

我使用Windows 7 64位。我的字節示例是近似的,即一條消息應該處於良好範圍內,另一條消息應該處於不良範圍。感謝您檢查問題沒有出現在Linux – 2014-10-03 05:32:34

回答

2

由於您使用的是Windows,我懷疑Windows將回車符(\x0D)添加到換行符(\x0A)。

根據Python 2.x - Write binary output to stdout?,防止在Windows上修改輸出流的方法是在將任何內容寫入stdout之前使用以下代碼片段。

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
+0

就是這樣。非常感謝。 – 2014-10-03 09:22:09

+0

在一些實現中可能沒有什麼區別,但一般來說,你應該確保stdin是二進制的。 – DaveWalley 2014-12-10 04:23:20