我正在開發使用本地消息傳遞主機的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