基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 。把原来的“主动调用recv()来接收数据,主动调用accept()来接受连接,主动调用send()来发送数据”的思路换成“注册一个接收数据的回调,基础网络库收到数据会调用我,将数据传给我,供我消费;注册一个接受连接的回调,网络库接受了新连接会回调我,将新的接对象给我,供我使用;需要发数据的时候,只管往连接中写,网络库会负责无阻塞的发送。”事件处理函数应该避免阻塞,以免网络服务失去响应。
作者认为,TCP网络编程最本质的是处理三个半事件:
1.连接的建立,包括服务端接受连接,客户端发起连接。TCP连接一旦建立,服务端和客户端是平等的,相互发送和接收数据。
2.连接的断开,包括主动断开(close、shutdown)和被动断开(read()返回0)。
3.消息到达,文件描述符可读。这是最重要的一个事件,对它的处理方式决定了网络风格的风格(阻塞还是非阻塞,如何处理分包,如何设计应用层缓冲等等)
3.5.消息发送完毕,这算是半个。对于低流量的服务可以不关心这个事件;“发送完毕”是指将数据写入操作系统的缓冲区,将由TCP协议栈负责数据的发送与重传,不代表对方已接收到数据。
这其中有很多难点,也有很多细节要注意,比方说:
-如果要主动关闭连接,如何保证对方已接收到全部数据?
-如果应用层有缓冲,如何保证断开连接之前将缓冲数据发送出去?直接调用close()估计不行。
-如果主动发起连接,对方主动拒绝,如何定期重试?
-非阻塞网络编程中该用边沿触发还是水平触发?
-......
后面陆续出解答博客。