本文共 1684 字,大约阅读时间需要 5 分钟。
muduo的IO模型是IO复用,且fd是非阻塞模式,若使用阻塞模式,IO线程可能阻塞在read,write等系统调用,这样的话,其他fd的IO事件到来,IO线程也不能够及时处理,也就不能最大限度的使用IO线程
为什么需要有应用层缓冲区(详见MuduoManual.pdf P76)
(1)2.4.2 为什么 non-blocking 网络编程中应用层 buffer 是必须的? (2)2.4.3 Buffer 的要求 (3)2.4.4 Muduo Buffer 的数据结构) (4)2.4.5 Muduo Buffer 的操作 应用层的发送缓冲区output buffer,应用层的接收缓冲区input buffereg:36\jmuduo\muduo\net\Buffer.h
36\jmuduo\muduo\net\Buffer.cc 36\jmuduo\muduo\net\CMakeLists.txteg:37\jmuduo\muduo\net\TcpConnection.h
37\jmuduo\muduo\net\TcpConnection.cc 37\jmuduo\muduo\net\TcpServer.cc 37\jmuduo\muduo\net\Callbacks.heg测试:37\jmuduo\tests\Reactor_test11.cc
jmuduo\tests\CMakeLists.txt测试:
telnet作为客户端客户端能发送数据,服务端还能回射回来 nc作为客户端应用程序想关闭连接,但是有可能正处于发送数据的过程中,oupt Buffer中有数据还没有发完,是不能直接调用close()的。
conn->send(buff); conn->shutdown();判断一下是否还有正在发送的数据,若还有正在发送的数据,则不应该关闭。eg:37\jmuduo\muduo\net\TcpConnection.cc
37\jmuduo\muduo\net\Channel.cceg测试:37\jmuduo\tests\Reactor_test12.cc
37\jmuduo\tests\CMakeLists.txt测试:服务端主动关闭连接
客户端使用nc测试 服务端主动关闭连接,服务端不会进入到37\jmuduo\muduo\net\Channel.cc的if ((revents_ & POLLHUP) && !(revents_ & POLLIN))eg测试:37\testcli.c
服务端:37\jmuduo\tests\Reactor_test11.cc测试:客户端故意等待10s再调用close()
服务端过了10s后,HUP和IN事件才到来转载地址:http://gmiws.baihongyu.com/