Я получаю сообщение «Inside onDisconnected(): Ошибка при общении с внутренним узлом обмена сообщениями». при отправке сообщения из моего собственного приложения-хозяина в расширение браузера.Получение «Ошибка при общении с внутренним узлом обмена сообщениями». при отправке сообщения с основного узла на расширение браузера (Windows)
Есть несколько вещей, которые могут вызвать это:
1) Неправильная длина послал в начале сообщения или неправильного порядка длины байтов отправленного (порядок байт).
2) Не ставьте stdout в двоичном режиме перед записью на него (если stdout находится в текстовом режиме, дополнительные байты могут быть добавлены отдельно от вашего кода).
3) Не отправляя сообщение как действительное json в UTF-8. На самом деле я не уверен, что недействительный json будет отклонен, но документы говорят, что сообщение должно быть json.
Код: кажется,
int nStdOutDescriptor = _fileno(stdout);
int result = _setmode(nStdOutDescriptor, _O_BINARY);
if(result == -1)
{
OutputDebugStringA ("Failed attempting to set stdout to binary mode\r\n");
return;
}
HANDLE hStdOut = (HANDLE) _get_osfhandle(nStdOutDescriptor);
if (INVALID_HANDLE_VALUE != hStdOut)
{
char *results = "{\"results\":\"0000\"}";
std::string sMsg(results);
int nMsgLen = sMsg.length();
unsigned char first = (unsigned char)(nMsgLen & 0x000000ff);
unsigned char second = (unsigned char)((nMsgLen >> 8) & 0x000000ff);
unsigned char third = (unsigned char)((nMsgLen >> 16) & 0x000000ff);
unsigned char fourth = (unsigned char)((nMsgLen >> 24) & 0x000000ff);
char *bufMsg = new char[4 + nMsgLen]; // allocate message buffer
const char *pMessageBytes = sMsg.c_str();
memcpy(&bufMsg[4], &pMessageBytes[0], nMsgLen);
bufMsg[0] = first;
bufMsg[1] = second;
bufMsg[2] = third;
bufMsg[3] = fourth;
DWORD dwNumBytesToWrite = nMsgLen + 4;
DWORD dwNumBytesWritten;
if (TRUE == WriteFile(hStdOut, (LPVOID)pMessageBytes, dwNumBytesToWrite, &dwNumBytesWritten, NULL))
{
BTrace (L"WriteFile() succeeded. Returned TRUE. %lu bytes written", dwNumBytesWritten);
}
_close(nStdOutDescriptor);
}
Все три из вероятных причин не будет происходить. Но я не могу найти какую-либо подробную информацию (даже глядя на источник, который предоставляет Google) о том, что вызывает мое конкретное сообщение об ошибке. WriteFile() преуспевает, а количество записанных байтов - 22 байта. Будут записаны 22 байт, из которых 4 байта длины. Я проверил, что первые 4 байта (в десятичном, а не в шестнадцатеричном): 18,0,0,0, которые по малой степени указывают, сколько байтов следует за составлением сообщения json. Когда я использую DebugView для просмотра моего сообщения json, он всегда: {"results": "0000"}. Это 18 байт/символов. Я даже экспериментировал с отправкой экранированных двойных кавычек в случае, если это предпочтительнее. На фоновой странице расширения браузера вызывается событие onDisconnected(), которое сообщает последнее сообщение об ошибке времени выполнения хрома (вот где я получаю сообщение об ошибке, определяющее этот вопрос). Это означает, что соединение между расширением и собственным хост-приложением закрывается. Помощь будет принята с благодарностью.
Разве вы не должны писать из bufMsg, а не pMessageBytes? Как бы то ни было, вы просто берете строку, а не длину. Также, возможно, захотите использовать FlushFileBuffers после записи. – donaddon
Ugh. В самом деле, это была проблема. Спасибо. Укажите свое решение в качестве ответа, чтобы я мог отметить его как правильно. – Alyoshak