socket -> 绑定端口,IP -> 监听socket -> 接受新连接 -> 处理读写... -> 关闭完成的连接socket,进行一些优化处理,设置一些属性之类的,但那都是固定模式,想想就能明白。硬要说重要的地方,也就是在于是否把socket设为非阻塞(non-blocking)了。所谓非阻塞,我还是不班门弄斧了,请移步 UNIX网络编程-卷1-中文·第三版 127页(英文版160页) 的图
6-6,清楚的对比了,阻塞,非阻塞,异步,I/O复用的区别和含义。十分建议写网络程序之前,去把这本书的某些章节大致过一遍。
我给一个不太严密的解释,那就是 将你这个程序需要等待的地方,集中起来
打个比方:
accept())了read, write),只不过套接字设为非阻塞的了。epoll, Unix(包括Mac)平台下的kqueue, Windows平台下的IOCP,各平台通用的select, poll,还有几个历史实现就不赘述了。select, poll在活跃连接明显少于总连接数的情况下,性能比前三个要差许多,故本章使用的是epoll,(当然还有资料比较多的原因啦说说 epoll 的工作
epoll_wait()调用上事件驱动
epoll_clt()来设置要监听的事件,当然也可以同时监听多个事件,看你的设计了。具体的epoll接口的详细介绍,可以直接在Linux上,使用man epoll进行查看手册,这是基本功。
epoll_create, epoll_ctl, epoll_waitepoll。那具体说一下,整个程序的流程epoll用来服务于接收新连接这个环节(accept)epoll用来处理这些新连接的事务。epoll)epoll来处理,监听套接字的读事件,也就是接受新连接epoll,用来平分处理这些新连接。小经验,在编程中,读往往比写要复杂许多。在网络编程里面亦是。
Visual Box,Windows下也可以使用商业版的VMware,Mac下有一个更棒的商业版选择Paralelle Desktop,但是这都是软件,算是无关紧要的。Linux发行版,由于我用的是 Debian系列的Ubuntu 16.04 LTS,所以我也推荐这个发行版,其他的发行版也许略有差异,不再多说。Clion或者Kdevelop。Vim我也不会阻拦,但是请装好两个插件Nerdtree和YouCompleteMe,配合好另一个软件tmux(简单使用),不然你会想死。Vim,你也可以选择 Visual Studio Code加装一个C/C++ tools也是不错的。Clion了,简单明了,且还是使用CMake作为构建工具。Google和Unix网络编程卷1,如果你两个都没有的话,不说了,再见。建议准备一个那玩意儿去访问Google。