00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 多进程并发服务器
  • 03. 多进程并发服务器实现思路
  • 04. 多进程并发服务器实现
  • 05. 附录

01. 概述

服务器设计技术有很多,按使用的协议来分有 TCP 服务器UDP 服务器,按处理方式来分有循环服务器并发服务器

循环服务器与并发服务器模型

在网络程序里面,一般来说都是许多客户对应一个服务器(多对一),为了处理客户的请求,对服务端的程序就提出了特殊的要求。

目前最常用的服务器模型

  • 循环服务器:服务器在同一时刻只能响应一个客户端的请求。
  • 并发服务器:服务器在同一时刻可以响应多个客户端的请求。

02. 多进程并发服务器

一个好的服务器,一般都是并发服务器(同一时刻可以响应多个客户端的请求)。并发服务器设计技术一般有:多进程服务器、多线程服务器、I/O复用服务器等。

在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是在客户服务器交互系统中。对于一个 TCP 服务器,客户与服务器的连接可能并不马上关闭,可能会等到客户提交某些数据后再关闭,这段时间服务器端的进程会阻塞,所以这时操作系统可能调度其它客户服务进程,这比起循环服务器大大提高了服务性能

03. 多进程并发服务器实现思路

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

#include <头文件>int main(void)
{//创建套接字//绑定套接字//设置监听while(1){int connfd = accept();//子进程if (0 == fork()){//关闭监听套接字close(sockfd);//数据处理//关闭连接套接字close(connfd);exit(0);}//关闭已经连接的套接字close(connfd);}close(sockfd);return 0;
}

04. 多进程并发服务器实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>    int main(int argc, char *argv[])
{unsigned short port = 8080;       // 本地端口 // 创建tcp套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);   if(sockfd < 0){perror("socket");exit(-1);}// 配置本地网络信息struct sockaddr_in my_addr;bzero(&my_addr, sizeof(my_addr));    // 清空   my_addr.sin_family = AF_INET;          // IPv4my_addr.sin_port   = htons(port);   // 端口my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip// 绑定int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if( err_log != 0){perror("binding");close(sockfd);       exit(-1);}// 监听,套接字变被动err_log = listen(sockfd, 10); if(err_log != 0){perror("listen");close(sockfd);     exit(-1);}while(1) //主进程 循环等待客户端的连接{char cli_ip[INET_ADDRSTRLEN] = {0};struct sockaddr_in client_addr;socklen_t cliaddr_len = sizeof(client_addr);// 取出客户端已完成的连接int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);if(connfd < 0){perror("accept");close(sockfd);exit(-1);}pid_t pid = fork();if(pid < 0){perror("fork");_exit(-1);}else if(0 == pid){ //子进程 接收客户端的信息,并发还给客户端/*关闭不需要的套接字可节省系统资源,同时可避免父子进程共享这些套接字可能带来的不可预计的后果*/close(sockfd);   // 关闭监听套接字,这个套接字是从父进程继承过来char recv_buf[1024] = {0};int recv_len = 0;// 打印客户端的 ip 和端口memset(cli_ip, 0, sizeof(cli_ip)); // 清空inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("----------------------------------------------\n");printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));// 接收数据while( (recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0 ){printf("recv_buf: %s\n", recv_buf); // 打印数据send(connfd, recv_buf, recv_len, 0); // 给客户端回数据}printf("client closed!\n");close(connfd);    //关闭已连接套接字exit(0);}else if(pid > 0){  // 父进程close(connfd);    //关闭已连接套接字}}close(sockfd);return 0;
}

05. 附录

【Linux】一步一步学Linux网络编程教程汇总

【Linux网络编程】并发服务器之多进程模型相关推荐

  1. Linux io模型及函数调用,Linux 网络编程的5种IO模型:信号驱动IO模型

    Linux 网络编程的5种IO模型:信号驱动IO模型 背景 这一讲我们来看 信号驱动IO 模型. 介绍 情景引入: 在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个 ...

  2. 【Linux网络编程】并发服务器之select模型

    00. 目录 文章目录 00. 目录 01. 概述 02. I/O复用技术概述 03. select模型服务器实现思路 04. select模型服务器实现 05. 附录 01. 概述 服务器设计技术有 ...

  3. 【Linux网络编程】并发服务器之多线程模型

    00. 目录 文章目录 00. 目录 01. 概述 02. 多线程服务器 03. 多线程服务器实现思路 04. 多线程服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按使用的协议来分有 ...

  4. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...

  5. Linux 网络编程——并发服务器的三种实现模型

    服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器,按处理方式来分有循环服务器和并发服务器. 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器(多 ...

  6. Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式

    文章目录 同步与异步 半同步/半异步模式 变体:半同步/半反应堆模式 改进:更高效的半同步/半异步模式 领导者/追随者模式 组件 :句柄集.线程集.事件处理器 并发模式是指I/O处理单元和多个逻辑单元 ...

  7. 【Linux】一步一步学Linux网络编程教程汇总(更新中......)

    00. 目录 文章目录 00. 目录 01. 基础理论知识 02. 初级编程 03. 高级编程 04. LibEvent库 05. 06. 07. 01. 基础理论知识 [Linux网络编程]网络协议 ...

  8. 【Linux网络编程】循环服务器之TCP模型

    00. 目录 文章目录 00. 目录 01. 概述 02. TCP循环服务器实现方法 03. TCP循环服务器模型 04. TCP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按使 ...

  9. 【Linux网络编程】循环服务器之UDP循环模型

    00. 目录 文章目录 00. 目录 01. 概述 02. UDP循环服务器的实现方法 03. UDP循环服务器模型 04. UDP循环服务器实现 05. 附录 01. 概述 服务器设计技术有很多,按 ...

最新文章

  1. IOT数据库选型——NOSQL,MemSQL,cassandra,Riak或者OpenTSDB,InfluxDB
  2. 解决使用CoreData时报duplicate symbol错误问题
  3. mysql分库分表总结
  4. bzoj1601: [Usaco2008 Oct]灌水
  5. 【Hibernate】JDBC操作与hibernate的区别
  6. BABOK - 需求管理和沟通(Requirements Management and Communication)概要
  7. MVC阻止用户注入JavaScript代码或者Html标记
  8. 携程集团CMO孙波入选“2021亚太营销领袖50强”榜单
  9. MLflow机器学习工作流框架更新(2019.3)
  10. 大数据实战之环境搭建(十)
  11. Delphi中TStringList类常用属性方法详解
  12. python判断用户名密码是否正确_Python账号密码登陆判断(三次机会)
  13. 个人计算机键盘上的按键击键声音小,按键盘每个键出现嘟嘟的声音也打不出字是什么...
  14. 好一个“Exchange20003”
  15. 一个屌丝程序猿的人生(八十六)
  16. 如何用Excel制作工作计划,跟踪任务进度,快来学习吧
  17. 【ZYNQ】那些年我们拿下了 Zynq
  18. Java实现 蓝桥杯VIP 算法提高 我们的征途是星辰大海
  19. Could not delete path ‘D:\AndroidStudioProjects\LargeScreen\app\build\generated\source\r\debug\andro
  20. #十二、编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三、编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定

热门文章

  1. 博客园——记录我的开始
  2. 谈谈DictionaryT1,T2和ListT的问题
  3. OnInit 和 Page_Init 事件有什么不同
  4. iPhone SDK发布
  5. 有关计算机代码的游戏,七灯游戏是一款经典的益智类游戏。游戏中,有七盏灯排成一圈,如图a所示,初始时灯的开关状态随机生成,操作其中某一盏灯,则可以切换该灯的“开/关”状态,同时,这盏灯-组卷网...
  6. C语言程序练习-L1-017 到底有多二 (15分)
  7. Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
  8. Java黑皮书课后题第2章:*2.17(科学:风寒温度)外面有多冷?...twc=35.74+0.6215ta-35.75v0.16+0.4275tav0.16,输入度数、风速显示风寒温度
  9. 数据结构与算法一 - 二叉树基础
  10. OWASP出品:Xenotix XSS漏洞测试框架及简单使用