3

Я получаю сообщение «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(), которое сообщает последнее сообщение об ошибке времени выполнения хрома (вот где я получаю сообщение об ошибке, определяющее этот вопрос). Это означает, что соединение между расширением и собственным хост-приложением закрывается. Помощь будет принята с благодарностью.

+0

Разве вы не должны писать из bufMsg, а не pMessageBytes? Как бы то ни было, вы просто берете строку, а не длину. Также, возможно, захотите использовать FlushFileBuffers после записи. – donaddon

+0

Ugh. В самом деле, это была проблема. Спасибо. Укажите свое решение в качестве ответа, чтобы я мог отметить его как правильно. – Alyoshak

ответ

2

Вы должны использовать bufMsg с WriteFile. Вы используете pMessageBytes, который просто отправляет строку, а не префикс длины.

Вы также должны рассмотреть возможность использования FlushFileBuffers после вызова WriteFile, поскольку в качестве общего правила вы хотите, чтобы ваше собственное приложение было отправлено немедленно.