背景:在编写一个软件与Chrome中插件进行通讯,由Chrome中的插件自动抓捕到网页信息,从而调用C++编写的程序,之间通过标准的输入输出进行通讯(数据格式为json文件)。Chrome中抓捕信息的特点是前4个字节作为整个后段内容数据的长度,因此在发送数据到Chrome时,必须是长度(4个字节)+数据段,外不能加任何无效字段,不然会出现通讯异常
出现的现象:在一台电脑上,当程序发送数据给Chrome时,这时Chrome会主动断掉应用程序,其他两台电脑则正常使用
问题:在使用标准输入输出时,用的fread、fwrite没有进行任何的格式设置(分为二进制、文本格式),而此时默认采用的是文本格式,当采用文本格式写入时,则数据段末尾会自动增加/a表示结束,因此Chrome中以为/a是下一个数据来了,,进行解析,亦发现没有数据,格式异常,因此断开了与应用程序的链接。二进制格式则不一样,数据不会进行任何的更改、添加,达到我们的效果
控制对文本、标准输入、输出格式的函数:setmode
示例:
/* SETMODE.C: This program uses _setmode to change
* stdin from text mode to binary mode.
*/
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
void main( void )
{
int result;
/* Set "stdin" to have binary mode: */
result = _setmode( _fileno( stdin ), _O_BINARY ); // O_TEXT
if( result == -1 )
perror( "Cannot set mode" );
else
printf( "'stdin' successfully changed to binary mode\n" );
}
MSDN链接:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa298581(v=vs.60)