在使用c语言写的cgi处理表单方式上传文件时,解析post过来的数据,发现客户端传来的数据中,行尾的回车换行 \r\n(crlf)在使用读接口fgetc从标准输入中读时,数据变成了\n(lf),导致按照content-length长度读时挂死在那里,服务器使用的是win7下的iis,换了linux下的shttpd服务器 就是正常数据。现在还没有找到具体的原因,在网上搜索也只有一两个人遇到过这个问题,但是也没有直接解决 ,而是规避了。先记录下,后续有时间再继续定位补充。
定位结论:
由于在windows下,C/C++提供的标准输入stdin默认是以"r"模式打开的,在Linux下由于"r"和"rb"效果相同,因此不会受到影响。在Windows下,"r"意味着文本模式,\r\n会被转换成\n,而且遇到EOF就会停止。
因此为了从标准输入读取二进制数据之前,需要将属性设置为二进制模式,使用以下代码以下代码:
#include <io.h>
#include <fcntl.h>
_setmode(_fileno(stdin), _O_BINARY);
测试ok。