Linux网络编程(3):并发服务器程序设计

在介绍并发服务器程序设计的过程中,先介绍下服务器模型。在网络编程中来说都是许多客户端对应一个服务端,为了处理客户需求,对服务端的程序就提出了特殊的要求,日常常用的服务器模型有:

1)循环服务器:服务器在同一时刻只能响应一个客户端要求

2)并发服务器:服务器在同一时刻可以响应多个客户端的请求


UDP循环服务器实现方法:

UDP服务器每次从套接字上读一个客户端的请求->处理->然后将结果返回给客户端

由于UDP是无向连接,客户端不需要发送连接请求,因此可以同时响应多个客户端,它是在一个进程中实现的。


TCP循环服务器实现方法:

TCP循环服务器接收一个客户端的连接,然后处理、完成了这个客户端的所有请求后,断开连接。

TCP循环服务器一次只能处理一个客户端请求。只有在这个客户端的所有请求都满足后,服务器才可以继续后面的请求。此时,如果一个客户端占主服务端不放时,其他客户端都不能工作。因此,TCP服务器一般很少用循环服务器。


TCP并发服务器

并发服务器思想:每个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。

socket(.....)
bind(.....)
listen(.....)
while(1){
accept();
if(fork(...)==0)
process(....)
close(....)
exit(1);
}
else 
close();
}

1:关于创建子进程的fork系统调用而言,我们了解了关于fork创建子进程的问题。

那可能会有这样的疑问,对于fork而言,子进程拷贝了fork以下的代码段、数据段等。从事着与父进程一样的工作,那么如何实现了子进程去处理,而父进程继续去监听端口呢?
其实这里面巧妙的运用了fork创建子进程以后,根据父子进程返回值的不同做了判断的处理。

在运用fork创建子进程时,父进程的返回值是子进程的PID,而子进程的返回值是0。

2:同样可以使用多线程来处理。

在创建进程进行处理时,除此之外也可以使用多线程进行处理。

运用pthread_create

因此可以做如此判断:

if((pthread_create(&tid,NULL,thr_fn,&com_fd))==-1);

线程创建成功返回0。


另外一种很重要的并发服务器模型是select函数。通过select函数,用多路复用I/O实现在单进程(线程)中处理多个客户的连接。关于select函数的具体运用,在另外的章节会详细介绍。

你可能感兴趣的:(Linux)