Linux网络编程之高级并发服务器解读.docVIP

  • 2
  • 0
  • 约 15页
  • 2016-03-07 发布于湖北
  • 举报
1. 介绍 在上一节,我们介绍了Linux简单的并发服务器,通过在服务器端建立多个子进程,来接收客户端的请求,实现并发处理,但这种方式明显有缺陷,服务器并不知道客户端请求的数量,所以事先建立的进程数不好确定。所以,这里介绍三种高级并发服务器模式。第一种是服务器端统一accept,接收客户端的到来,然后为每个客户端分配一个进程去处理. 第二种是统一accept接收请求,然后为每个客户端分配一个线程去处理。第三种建立多个线程去处理客户端请求,每个线程独自监听客户端的请求。显然,第一种方案解决了简单服务器的并发问题。第二种方案其实是对第一种方案的改进,因为线程切换的开销明显要小于进程切换的开销。第三种方案就是原来用进程去处理每个请求,现在换成用线程去处理,个人认为改进不是很大. 2. 高级并发服务器算法流程 (1)统一accept,多进程 ? socket(...); ? bind(...); ? listen(...); ? while(1){ ? accept(...); ? fork(...);//子进程 ?} ?close(...);//关闭服务器套接字 子进程: ?recv(...); ?process(...); ?send(...); ?close(...);//关闭客户端 (2)统一accept,多线程 ? socket(...); ? bind(...); ? listen(...); ? while(1){ ? accept(...); ? pthread_create(....);? ?} close(...);//关闭服务器 线程1: recv(....); process(....); send(...); close(...);//关闭客户端 (3)accept放入每个线程 ?socket(...); ?bind(...); ?listen(...); pthread_create(...); pthread_join(...);//等待线程结束 close(...);//关闭服务器 线程1: Mutex_lock//互斥锁 accept(...); Mutex_unlock(...); recv(...); process(...); send(...); close(...);//客户端 3. 相关例子 TCP服务器: (1)统一accept多进程 服务器; #include stdio.h #include string.h #include stdlib.h #include sys/socket.h #include sys/types.h #include netinet/in.h #include time.h /** 高级并发服务器 TCP统一accept 当有客户端到来时,为每个客户端建立进程,然后每个进程处理客户端的请求,动态的建立进程 **/ #define PORT 8888 #define BUFFERSIZE 1024 #define BACKLOG 2 static void handle(int sc){//处理客户端的请求 ? char buffer[BUFFERSIZE]; ? time_t now; ? int size; ? memset(buffer,0,BUFFERSIZE); ?? size=recv(sc,buffer,BUFFERSIZE,0); ? if(size0!strncmp(buffer,TIME,4)){//时间服务器,当客户端请求时间就把时间发送给客户端 ????? memset(buffer,0,BUFFERSIZE); ????? now=time(NULL); ????? sprintf(buffer,%24s\r\n,ctime(now)); ???? send(sc,buffer,strlen(buffer),0); } ?close(sc); } int main(int argc,char*argv[]){ ? int ret; ? int s; ? int sc;//用于服务器与客户端进行数据传输的套接字 ? struct sockaddr_in server_addr; ? struct sockaddr_in client_addr; ? int len; ? len=sizeof(client_addr); ? //建立流式套接字 ? s=socket(AF_INET,SOCK_STREAM,0); ? if(s0){ ??? perror(socket error); ?? return -1; ? } ?//将地址结构绑定到套接字描述符上去 ?memset(server_addr,0,sizeof(serve

文档评论(0)

1亿VIP精品文档

相关文档