我正在开发使用本地消息传递主机的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为本地消息传递主机创建一个可执行文件。
适合我的工作(Linux)。你在使用哪种操作系统?而你的字节计算有点偏离。在你的问题中,你提到了'x'的数量,而输出还包含其他字符('{“type”:...}')。 – 2014-10-02 18:30:04
我使用Windows 7 64位。我的字节示例是近似的,即一条消息应该处于良好范围内,另一条消息应该处于不良范围。感谢您检查问题没有出现在Linux – 2014-10-03 05:32:34