最近一直被这个问题所困扰,使用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中读取数据后,问题解决.
小存储嵌入式设备上使用thttpd进行文件上传遇到的问题
最新推荐文章于 2024-09-05 11:56:29 发布