select模型的缺点:
1、最大并发数限制。由于一个进程所打开的文件描述符fd有限,有FD_SETSIZE设置,默认最大为1024/2048,因此并发数被限制。(poll中克服了这一问题)
2、效率问题。 每次进行select调用都会采用轮询fd方式(线性扫描全部的fd)。时间复杂度O(n)
3、内核/应用空间内存拷贝。select在解决将fd消息(内核空间)传递给用户空间时采用了内存拷贝方法。
简单通过select函数实现I/O复用完成并发服务器的编写:
功能:将select函数运用在服务器中,实现I/O复用
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<sys/times.h>
#include<sys/types.h>
#include<sys/select.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 5678
#define IP "10.21.12.13"
int main(int argc,char *argv[])
{
int sockfd,listenfd;
int err;
int client_addrlen,bytes;
fd_set globe_nfds,current_nfds;
int nfds,i;
char buf[128];
struct sockaddr_in server_addr, client_addr;
client_addrlen = sizeof(struct sockaddr_in);
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd == -1)
{
printf("creat socket error