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