小存储嵌入式设备上使用thttpd进行文件上传遇到的问题

最近一直被这个问题所困扰,使用thttpd作为嵌入式httpserver进行设备升级时,上传升级文件时server端总是无故断开,由于最开始我使用了cgic库来进行编码,后来对源码进行分析,发现cgic在处理上传数据时会存储为临时文件,由于系统flash比较小,没有足够的地方存放临时文件,因此出错了,后来不使用cgic库进行调试,发现上传依然不成功,就开始对thttpd的源码进行跟踪和分析,发现thttpdserver对post方式上传文件进行了不同的处理,由于最初查找的一篇资料说thttpd把接收过来的数据也暂存为了临时文件,因此就一直在源码中找这一段,后来发现thttpd并没有进行临时文件的存储,他在POST操作时,进行了分支处理,当被POST的页面是静态页面时,其他数据直接丢弃,但是config.h中定义了一个LINGER_TIME设定了时间限制,当POST静态页面超过LINGER_TIME设定的时间时,连接就会意外中断.当被POST的页面是CGI文件时,他在libhttpd.c的cgi_child函数中fork出了两个子进程,这两个子进程都对应一个管道,其中一个进程负责从socket中接收数据,然后进行管道写操作,写管道的目标是被重定向后的标准输入stdin,另一个子进程负责从标准输出stdout中取数据(就是返回给浏览器的数据),在进行跟踪后,发现,POST中断在管道写操作这个函数中(cgi_interpose_input),在对标准输入进行写操作时,由于stdin中的数据没有及时没读取,导致了管道操作失败,当在cgi页面中同步使用fread从stdin中读取数据后,问题解决.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值