在上一篇博客libevent多线程不发数据的问题研究了libevent多线程下如何正确的进行数据收发
原以为问题已经解决,没想到数据量大后,依然会出现数据接收不完全的问题。一直以为是bufferevent_write不对。检测返回值发现成功。但是接收端确实是没收到这么多数据。获得fd后,自行调用write,也出现同样问题。使用wireshark抓包发现,数据包是成功发出的。
经过群友点拨,应该是数据处理的问题。在Linux中,epoll的事件触发有两种,边缘触发,水平触发。
边缘触发:有数据来,你都没读完都不再通知。
水平触发:只要你没有读完,就一直有通知。
这个情况的描述感觉和我的状况非常相似,然后找到一篇文章:Libevent触发模式。原来,libevent的通知是边缘触发。所以,我需要一直读,直到bufferevent_read返回0。所以,将代码中的do while false 改为 do while true就解决了。