Собственный узел обмена сообщениями не может отправить 1 МБ данных

Я использую native-host в C ++, когда я отправляю base64 из собственного приложения в расширение chrome (Native Messaging) с размером base64 < 1M, программа все еще работает. но когда я отправляю base64 из собственного приложения в расширение chrome (собственный обмен сообщениями) с размером base64> 1M, программа выдает ошибку «Ошибка при соединении с собственным хостом обмена сообщениями», мой код ниже

int _tmain(int argc, _TCHAR* argv[])
{
std::cout.setf( std::ios_base::unitbuf );
unsigned int c, t=0;
inp="";
t=0;
// Sum the first 4 chars from stdin (the length of the message passed).
for (int i = 0; i <= 3; i++) {
//t += getchar();
t += std::pow(256.0f, i) * getchar();
}
// Loop getchar to pull in the message until we reach the total
//  length provided.
for (int i=0; i < t; i++) {
c = getchar();
inp += c;
}

unsigned int len =  inp.length();
// We need to send the 4 btyes of length information
std::cout << char(((len>>0) & 0xFF))
<< char(((len>>8) & 0xFF))
<< char(((len>>16) & 0xFF))
<< char(((len>>24) & 0xFF));
// Now we can output our message
std::cout << inp;
return 0;
}

1

Решение

Собственные узлы обмена сообщениями не могут отправлять сообщения с длиной более 1024 * 1024 байтов. От

https://cs.chromium.org/file%3Anative_message_process_host.cc%20kMaximumMessageSize:

// Maximum message size in bytes for messages received from Native Messaging
// hosts. Message size is limited mainly to prevent Chrome from crashing when
// native application misbehaves (e.g. starts writing garbage to the pipe).
const size_t kMaximumMessageSize = 1024 * 1024;

Чтобы обойти эту проблему, необходимо разделить сообщение, отправленное с собственного узла обмена сообщениями на ваше расширение / приложение, на куски размером менее 1 МБ.
На вашем собственном хосте обмена сообщениями вы можете создать цикл, который будет периодически выводить 32-битную длину сообщения (не более 1 МБ), за которой следует фрагмент сообщения.
В вашем приложении / расширении используйте chrome.runtime.connectNative вместо chrome.runtime.sendNativeMessage открыть порт, который длится дольше, чем одно сообщение (если вы используете sendNativeMessageпорт будет закрыт после получения одного ответа, что приведет к прекращению работы собственного узла обмена сообщениями).

3

Другие решения