本文共 618 字,大约阅读时间需要 2 分钟。
之前写过一些版本,但没有使用io复用,导致效率比较低。我选择了epoll轮询机制,发现它的设计非常巧妙。epoll_wait函数可以监wait事件源,当有并发事件发生时,它会返回一组事件。每个事件都有data.fd字段,用来区分是已经被监听的服务器socket描述符还是接受连接后的新描述符。如果是被监听的socket有事件发生,就需要进行accept操作,将新的描述符重新加入epoll事件列表。如果是针对epollin可读事件的描述符,则需要执行相应的io操作。这类io操作需要谨慎处理,建议优先使用recv和send等高效的接收函数,避免使用read和write等可能导致内核陷入的API。有关这一方面的信息,或可参考零复制的相关知识。
代码托管在了github上运行。与上一个版本相比,本次在后端仍然使用http协议处理客户端发出的数据流,并向客户端返回收到的字节数。之后又开发了一个客户端与服务器配对的版本,虽然主要目的是探索epoll的应用,但通过这次实践,我深刻认识到编程能力的提升并非仅靠练习 vệASYNCIO而能快速实现,而是需要在编程之前,就如作家在作画前构思整体构思那样,预先在脑海中形成全局思想。编程就像作画,需要从构思到具体操作都要有清晰的规划。在探索epoll机制的过程中,不仅加深了对epoll轮询的理解,更体会到了编程中的哲理。现在把代码托管到github上,方便维护和分享,也为以后的开发提供了参考。
转载地址:http://wlcxz.baihongyu.com/