markparticle / WebServer

C++ Linux WebServer服务器
Apache License 2.0
3.58k stars 733 forks source link

缓冲区的线程问题 #65

Open learnmore-HDU opened 2 years ago

learnmore-HDU commented 2 years ago

我最近想在现有缓冲区的基础上加一个上传文件的过程,写好代码后再用gdb调试,发现处理缓冲区的过程中会有别的线程进来读处理过的内容,导致读混乱,然后遇到buffer的断言,程序就被Absort了。 我的做法是解析body的时候,添加一个函数,解析我的multipart/form-data,也就改了httprequest文件。这个线程问题搞得我很迷茫阿,我也看了线程池的创建,解完锁再执行的task,再上锁。我感觉逻辑上也没什么问题。但现在就是几KB的文件可以完整的传上去,文件一大就会遇到问题

kusanagi-tomoko commented 2 years ago

如果文件太大,上传的时候就会分成多个网络包发送,所以同一个client的socket对应的fd会被触发两次, 每一次都会分配一个线程去读client对应的httpconnect实例的buffer

kusanagi-tomoko commented 2 years ago

http协议头应该有content-length, 每次从缓存读数据的时候需要判断一下收到的数据的长度是不是 content-length