问题描述
下面的 C 代码用于读取从 Web 浏览器的本机消息传递 API 发送的 JSON 消息,根据 Firefox MDN,“以包含本机字节顺序的消息长度的 32 位值开头”。
>其中有超过 5000 个已正确传递,但每次在 while 循环中都有两个特定的失败,这似乎意味着无法读取指示 JSON 字符串字节长度的前缀。永远不会进入 while 循环。有几次,几个 JSON 消息失败了,但随后又成功了。但是这两个每次都失败了。
每条消息的 JSON 都非常相似,唯一的区别是数据量。结构和内容类型相同。每次失败的两个既不是最大的也不是最小的。在扩展端,这两个一致失败传递的 JSON 的 JSON.stringify().length
是 6859 和 6747。
JSON 字符串可以打印到浏览器控制台,看起来不错。如果它以某种方式格式错误,我认为消息传递 API 将根本无法发送它,更有可能的是,JS 代码将在尝试发送之前失败。
我知道消息从扩展发送到 C 代码没有错误,因为扩展在发送之前将消息写入控制台并指示正在执行发送。然后,扩展表明与本机应用程序的连接端口已关闭。在整个 C 代码中都有错误捕获以将错误消息返回给扩展。但是,错误似乎发生在消息长度的 fread
处,因为从未向扩展返回任何错误。此外,当错误从 C 代码发送到扩展时,连接端口不会关闭。仅在发生未捕获的错误或 C 代码返回错误的 JSON 消息时才关闭;但是,如果出现错误的 JSON 消息,扩展会在关闭端口之前将该错误作为格式错误的 JSON 写入控制台。这些都没有发生。
如何测试 C 代码中发生的事情?本机消息传递 API 设置了大小前缀,我不知道可以在 C 代码中检查什么,因为它在读取消息长度时失败。
代码块为 xout: 1,l: 16134,s: 4
的 JSON.stringify().length
的 JSON 字符串写入 16116
,为 xout: 0,l: 16242,s: 4
的 JSON.stringify().length
的 JSON 字符串写入 6747
}} 对于一个失败的人。
JSON 字符串中可能有一些转义字符。也许,JSON.stringify().length
会计算它们而 fread
不会,作为对第一个字符串长度差异的解释。但是,失败的第二个字符串的 fread
长度是 JSON.stingify().length
的两倍多。这是否表示本地消息前缀中存在错误?
谢谢。
现在可以使用了。我应该说我在 Windows 操作系统中工作,以下解决了这个问题。这已经多次咬我的背面,我一直忘记它,直到我浪费了几个小时的时间。我为 stdout
设置了它,但认为 stdin
不需要它。就是 Windows 中的 /r/n issue。
我不明白为什么它会影响二进制值的读取,但总的来说我不太了解它。
// Set "stdin" to have binary mode:
if( _setmode( _fileno( stdin ),_O_BINARY ) == -1 )
perror( "Cannot set mode" );
else
send_response( "{\"d\":\"stdin successfully changed to binary mode.\"}" );
// Set "stdout" to have binary mode. Without this code for Windows OS,a response having a length that is a multiple of 256 plus 10 will fail.
if ( _setmode( _fileno( stdout ),_O_BINARY ) == -1 )
perror( "Cannot set mode" );
else
send_response( "{\"d\":\"stdout successfully changed to binary mode.\"}" );
int listen( void )
{
int x,i = 0,rc;
uint32_t msg_len;
while ( ( x = fread( &msg_len,sizeof msg_len,1,stdin ) ) == 1 )
{
char *buf = malloc( msg_len );
if ( !buf )
{
}
else if ( fread( buf,sizeof *buf,msg_len,stdin ) != msg_len )
{
}
else
{
// Success send to routing function.
printf( "{\"xout\":%d,\"l\":%lu,\"s\":%lu}",x,(unsigned long)msg_len,sizeof msg_len );
}
fflush( stdout );
// cleanup
free( buf );
}
printf("{\"xout\":%d,sizeof msg_len );
return 0;
} // close listen
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)