当服务器需要服务多个客户时,需要使用并发通信,实现并发通信有以下几种方法:
1、在服务器中fork子进程来为每个客户服务 具体可参考http://www.cnblogs.com/ggjucheng/archive/2012/01/17/2324584.html
2、epoll
step1: int epfd = epoll_create(intsize); //通知内核需要监听size个fd
step2: int epoll_ctl(int epfd, int op, int fd, struct epoll_event*event); //注册事件,一般为server fd,即listener
step3: int epoll_wait(int epfd, struct epoll_event * events, intmaxevents, int timeout); //等待事件触发,等侍注册在epfd上的socket fd的事件的发生,如果发生则将发生的sockct fd和事件类型放入到events数组中。注:发生的条件为events[n].data.fd == listener,即如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
step4:将这个客户端的event通过epoll_ctl加入到epoll的监听队列里面
step5:events[n].data.fd != listener时,意味着不是主socket的事件,是一个用户socket的事件,可以用来处理这个用户socket的事情
以下内容摘自知乎:
服务器后端框架其中大致差不多,可从以下几个部分去综合考虑设计:
一、套接字IO模型(Linux)
1 应用场景:a.登陆低并发,大量长连接,少量活动连接,TCP;b.业务未知,对事件的响应时间未知。
2 进(线)程模型设计:1.a中的场景是最适合使用epollIO复用模型,这种情况下,epoll的效率比其他IO复用模型(select,poll)要高效。如果业务简单(不耗时,不阻塞):单进程+eppll足以应付,在epoll的主循环中依次处理事件即可。业务比较耗时:单进程多线程+epoll或多进程+epoll,主进(线)程负责监听和分发事件,工作进程(线程)处理事件。