非阻塞轮询
就是将所有的套接字都设置为非阻塞模式,可以解决客户不发出数据导致服务器端卡死的问题,但是非阻塞套接字也无法妥善地告知服务器数据何时到达,所以服务器需要不断地尝试读取客户端数据。
fcntl()函数可以设置或者获取套接字文件的属性
多任务并发
多任务并发模型就是利用多进程或者多线程来达到同时处理多个套接字的目的。一般而言,进程用于具有较完整逻辑块的整合。如果只是处理网络套接字的数据,那么一般使用多线程。
对于UDP而言,由于不存在连接的问题,因此服务端一个UDP套接字可以接收任意的客户端发来的数据,可直接将该套接字交由一条专用于收发数据的线程管理即可。
对于TCP而言,首先创建一条专门的线程处理监听套接字,用于随时监听和接受客户端的连接请求。另外由于每当有一个客户端连接成功,服务端都会产生一个新的连接套接字来与之通信,那么就应该每产生一个套接字就分配一条线程与之对应,便可形成多任务并发的服务器IO模型。
异步信号
指的是用信号来驱使服务器妥善处理多个远端套接字,每当远端有数据到达,那么就在本端触发信号,然后利用信号的异步特性来处理这些远端信息。
多路复用
多路复用指的是通过某个特定的接口来同时监听多路阻塞IO,这就达到既无需多进程多线程,又可以同时处理多个阻塞套接字的目的。
Linux系统中提供了两个函数select()或poll()实现同时监控多个套接字,当发现一个或多个套接字的某种状态就绪(读状态、写状态)时,再调用相应的函数去处理的过程。