gpt4 book ai didi

python - Chrome native 消息传递不接受特定大小的消息 (Windows)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:43 26 4
gpt4 key购买 nike

我正在开发一个与本地消息传递主机一起工作的 Chrome 扩展。它在大多数情况下都有效,但是当我发送特定大小的消息时,我发现了一个奇怪的行为。当大小介于 2560 和 2815 字节(十六进制的 A00 和 AFF)之间时,消息似乎被丢弃了。所有后续消息也未到达,这表明流由于某种原因已损坏。

这是一个精简的 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);
}
}

有人知道这里会发生什么吗?

更新

我在 64 位版本的 Windows 7 和 Windows 8.1 上遇到过这个问题。

我在稳定版、Beta 版和 Dev 版上试用了 64 位 Chrome - 版本 37、38 和 39。我也尝试过稳定的 Chrome 32 位

我使用 32 位版本的 Python 2.7.7 和 PyInstaller 2.1 为 native 消息传递主机创建可执行文件。

最佳答案

由于您使用的是 Windows,我怀疑 Windows 正在向换行符 (\x0A) 添加回车符 (\x0D)。

根据 Python 2.x - Write binary output to stdout? , 一种防止在 Windows 上修改输出流的方法是在将任何内容写入标准输出之前使用以下代码段。

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

关于python - Chrome native 消息传递不接受特定大小的消息 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com