Python Chrome本机消息传递不';不接受特定大小的邮件(窗口)
我正在开发一个与本机消息传递主机一起工作的Chrome扩展。 它在大多数情况下都能工作,但当我发送特定大小的消息时,我发现了一种奇怪的行为。 当大小介于2560和2815字节之间(十六进制中的A00和AFF)时,消息似乎被丢弃。所有后续消息也没有到达,这表明流由于某种原因已损坏 下面是一个精简的Python本机消息传递应用程序,可用于测试它:Python Chrome本机消息传递不';不接受特定大小的邮件(窗口),python,c++,google-chrome-extension,chrome-native-messaging,Python,C++,Google Chrome Extension,Chrome Native Messaging,我正在开发一个与本机消息传递主机一起工作的Chrome扩展。 它在大多数情况下都能工作,但当我发送特定大小的消息时,我发现了一种奇怪的行为。 当大小介于2560和2815字节之间(十六进制中的A00和AFF)时,消息似乎被丢弃。所有后续消息也没有到达,这表明流由于某种原因已损坏 下面是一个精简的Python本机消息传递应用程序,可用于测试它: import sys import struct def output(message): encoded_message = message.
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))
我收到的是第一条信息,而不是第二条
我已经查看了中的代码。似乎负责该功能的函数没有任何特殊之处:
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);
}
}
void NativeMessageProcessHost::ProcessIncomingData(
常量字符*数据,整数数据(单位大小){
DCHECK_当前打开(内容::浏览器线程::IO);
传入数据追加(数据、数据大小);
while(true){
if(传入的数据大小()kMaximumMessageSize){
日志(错误)由于您使用的是Windows,我怀疑Windows正在向换行符(\x0A
)添加回车符(\x0D
)
根据,防止在Windows上修改输出流的一种方法是在将任何内容写入标准输出之前使用以下代码段
如果sys.platform==“win32”:
导入操作系统,msvcrt
msvcrt.setmode(sys.stdout.fileno(),os.O_二进制)
适合我(Linux)。您使用的是哪个操作系统?您的字节计算有点不准确。在您的问题中,您提到了“x”的数量,而输出还包含其他字符({“type”:…}
)。我使用Windows 7 64位。我的字节示例在某种程度上是近似的,一条消息应该在一个好的范围内,第二条消息应该在一个坏的范围内。感谢您检查该问题在Linux中没有出现,就是这样。非常感谢。在某些实现中可能没有什么不同,但通常您应该确保stdin也是二进制的。