C语言使用fcgi输出二进制文件

       尝试使用"Content-Disposition: attachment; filename=test.dat"的http头的方式来提供文件下载功能,结果发现对于某些文件,下载的文件长度比期望的长,分析后发现,文件中的0x0D('\n')被输出成0x0A0D("\r\n")。尝试了各种fcgi中的各种接口,始终无果。 

      最终,在网上各种搜索,终于看到了一篇文章讲Python调用"msvcrt.setmode(1, os.O_BINARY) " 可解决类似的问题,于是搜索想到msvcrt.setmode是否为系统函数,C++也可调用呢,果然,在微软官网看到C++的例子(附在后面)。

       完整的使用fcgi输出二进制的数据流的代码如下:

#include "fcgi_stdio.h"
#include <io.h>
#include <fcntl.h>


void printBinaryFile()
{
    char data[10] = {'A', 0, '\r', 'C', '\n', 'D'};

    //期望文件大小为6个字节;不调用_setmode的话,下载得到的test.dat文件为7个字节,因为把第五个'\n'输出为"\r\n"了
    int result = _setmode(_fileno(stdout->stdio_stream), _O_BINARY);
    if (result == -1)
    {
        printf("Content-type: text/html\r\n"
            "\r\n");
        printf("Cannot set mode");
    }
    else
    {
        printf("Content-Disposition: attachment; filename=test.dat\r\n");
        printf("Content-type: application/octet-stream\r\n\r\n");
        fwrite(data, 6, 1, stdout);
    }
}


void main(void)
{
    int count = 0;
    while(FCGI_Accept() >= 0)
    {
        printBinaryFile();
    }
}

 

附:

1、环境说明: windows、vs2010、fcgi2-2.4.2(CGI的C语言库)。

2、参考链接

https://www.7forz.com/2527/

https://docs.microsoft.com/zh-cn/previous-versions/tw4k6df8(v=vs.110)

3、微软官网上setmode的例子

// crt_setmode.c
// This program uses _setmode to change
// stdin from text mode to binary mode.


#include <stdio.h>
#include <fcntl.h>
#include <io.h>

int main( void )
{
   int result;

   // Set "stdin" to have binary mode:
   result = _setmode( _fileno( stdin ), _O_BINARY );
   if( result == -1 )
      perror( "Cannot set mode" );
   else
      printf( "'stdin' successfully changed to binary mode\n" );
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piaopiaolanghua

感谢鼓励,再接再厉!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值