关于LT触发 read和write的理解问题 #692
-
epoll采取lt触发,一次有可能并没法读取全部的数据,但是我在拜读muduo代码的时候,并没有看到比如说http connection的messagecallback中,buf是可能经过多次读取 ,整合成完整数据,然后再使用http去parse整个buf,如果一次读取没有完整读取,此时去parse不是会出问题的嘛,可是我在代码中好像没看到具体是是怎么处理的,, 还有write,一次如果没写完,存入了 outputbuffer,但是我好像也没看到代码中是如何对于outputbuffer在epoll进行一个持续的写的 行为。 请教一下各位 具体的代码是在哪去看呢,我好像还没看懂这个流程 |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 1 reply
-
比如代码中这一段,readfd之后就直接调用messagecallback了,但是如果此次数据并未读完呢 |
Beta Was this translation helpful? Give feedback.
-
muduo库中http的onmessage,,假设一个超大的http内容,一次没读取完,parse出来的结果岂不是不太对 |
Beta Was this translation helpful? Give feedback.
-
okk看到了那个 onmessage的细节里面了,gotall,上面parse具体咋做的,我之前没点进去细看,以为只parse一次。。 |
Beta Was this translation helpful? Give feedback.
write就是先直接向fd里面写,写不完,说明发送缓冲区满了,然后剩下的字节就靠epoll异步通知写完就行了,
对于解析,采用的是状态机的形式,每次读数据都是同一个parse对象,状态机就是应对流数据的,流数据就是不可能一次性解析完的数据,建议你好好了解一下什么是状态机。