第26课-网络并发服务器设计

26.1 问题描述

在我们第24节课操作的内容中。是有一个服务器和一个客户端的条件。但是在生活中,我们会遇到多个客户端的情况。我们先在linux系统上做一下模拟操作,在一个终端运行./tcp_server,在另外两个终端分别运行./tcp_client程序。我们会发现客户端对第一个运行的程序响应后就不会对另一个响应,直到第一个运行结束,然后才会运行第二个。这种情况也叫循环服务器。这样的服务器处理的效率是非常低的。

26.2 解决办法

为了解决上面的问题,我们引入并发服务器,并发也就是能够同时处理的意思。可以采用的方法很多(多进程,多线程等),今天我们采用多进程的方法。

编程实现并发服务器。我们先看一下,以前我们编的程序的运行步骤:(1)创建套接字(2)绑定套接字(3)循环:建立连接,数据处理(4)结束。问题就出现在第三步上,当我们进行数据处理的时候,若没有处理完数据就会一直等待,然后才会去建立新的连接。为了解决这一个问题,我们可以建立子进程,让子进程去处理数据,父进程就可以一直处于建立连接的过程。每建立一个连接,就把它交给一个子进程。这样就提高了效率。

tcp_server_fork.c

#include<sys/socket.h>

#include<stdio.h>

#include<string.h>  //字符串头文件

#include<netinet/in.h>  //地址的头文件

#define portnum 3333

int main()

{

int sockfd;

int new_fd;

char buffer[128];//定义存储数据的字节

int nbyte;//接收到的字符串的长度

int sin_size;

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

int pid;

//1.创建套接字

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

printf("creat socket error!\n");

exit(1);

}

//2.1 设置要绑定的地址

bzero(&server_addr, sizeof(struct sockaddr_in));//清零

server_addr.sin_family = AF_INET;  //网络协议

server_addr.sin_port = htons(portnum);  //端口,超过两个字节就要转换

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//表示任意地址,超过两个字节就要转换

//2.2 绑定地址

bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr));//表示指针的强制转换

//3.监听端口

listen(sockfd, 5);

while(1)

{

//4.等待连接

sin_size = sizeof(struct sockaddr);

new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size);

printf("server get connection from %s\n", inet_ntoa(client_addr.sin_addr));//取客户机的ip地址,并且将整型地址转换成字符串地址

//创建子进程,由子进程来处理数据

if(pid=fork() == 0) //创建子进程,如果pid等于0就是子进程,不等于0是父进程

{

//5.接收数据

nbyte = recv(new_fd,buffer,128,0);

buffer[nbyte] = '\0';//字符串的结束符

printf("server received: %s \n",buffer);

close(new_fd);

close(sockfd);

exit(0);

}

else if(pid<0)

printf("fork error!\n");

//6.结束连接

close(new_fd);

}

close(sockfd);

return 0;

}

tcp_client.c还用24课的程序。

运行结果:我们可以在三个端口中分别启用tcp_server_fork,tcp_client,tcp_client。我们会看到tcp_server_fork程序可以同时的去处理两个客户机的程序。

转载于:https://www.cnblogs.com/free-1122/p/11357338.html

第三季-第26课-网络并发服务器设计相关推荐

  1. 并发服务器设计思路,参考apache学习UDP和QoS,研究成果

    研究了快1个月的服务器架构,把研究成果记录一下. 参考的有:Apache  vlc  ACE  ftp 我主要需要其中的并发处理,内存管理,TCP/UDP.QoS,速度限制等方面的内容,所以着重说这几 ...

  2. Socket基础四:基于流式套接字的网络程序(并发服务器设计)

    作者:刘磊 2020.4.27 参考书目:<Windows网络编程>刘琰等著 并发性 并发性是TCP/IP程序的基础,服务器软件必须在程序中有专门的支持并发的硬件或专门的机制实现并发处理. ...

  3. 【Linux网络编程】并发服务器的三种实现模型

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

  4. linux网络编程之并发服务器的三种实现模型 (超级经典)

    转载 : http://blog.csdn.net/tennysonsky/article/details/45671215 服务器设计技术有很多,按使用的协议来分有 TCP 服务器和 UDP 服务器 ...

  5. Linux网络编程——tcp并发服务器(多进程)

    https://blog.csdn.net/lianghe_work/article/details/46503895 一.tcp并发服务器概述 一个好的服务器,一般都是并发服务器(同一时刻可以响应多 ...

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

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

  7. 网络编程实战之高级篇, 彻底解决面试C10k问题, 高并发服务器, IO多路复用, 同时监视多个IO事件

    目录 一.前言 二.IO多路复用的理解 三.IO多路复用的发展 select poll epoll ​四.C10K服务端代码 五. 总结 一.前言 网络入门篇,从操作系统的层次推开网络大门 网络入门基 ...

  8. linux线程池实现多线程并发,基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF...

    基于Linux的多线程池并发Web服务器设计-电子设计工程.PDF 第 卷 第 期 电子设计工程 年 月 基于 的多线程池并发 服务器设计 陈 涛 任海兰 武汉邮电科学研究院 湖北 武汉 摘要 时至今 ...

  9. LINUX环境并发服务器的三种实现模型

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

  10. 无线边缘服务器,无线传感网络边缘服务器研究

    摘要: 无线传感器网络(Wireless Sensor Network)是目前信息科学与自动化技术研究的一个热点问题,具有广阔的应用前景.随着无线传感网络的快速发展,一种新型网络结构Sensor In ...

最新文章

  1. 洛谷 P4706 取石子 解题报告
  2. spring aop源码实现分析
  3. React Native 设置RGBA背景色
  4. hdu1024Max Sum Plus Plus
  5. 垃圾回收算法与实现系列-Java的Class文件详解
  6. 为什么PHP能够受到大家追捧和喜爱,又为什么饱受嘲讽?
  7. Java 获取昨天、当前、明天的时间
  8. Silverlight+WCF 新手实例 象棋 介绍II(九)
  9. 北京工业大学微型计算机接口技术考试,汇编语言微机原理及接口技术期末试卷含答案...
  10. SAP GUI 安全性 下载文件
  11. 非线性动力学_第17届全国非线性振动暨第14届全国非线性动力学 和运动稳定性学术会议在南京召开...
  12. CISP能线上考试吗?
  13. R语言isprime函数素数(prime number)判断实战
  14. springboot基于协同过滤算法的书籍推荐毕业设计源码101555
  15. [RK3399][Android7.1] 调试笔记 --- Recovery模式下无法挂载/data分区
  16. 【转】word提升图像质量
  17. base64 decode java_Java实现Base64编解码
  18. [极客时间]《算法面试通关40讲》
  19. C语言打印cav,最近大热的Cav Empt(C.E),你了解?
  20. nginx各种代理配置

热门文章

  1. JavaEE学习10--Ajax
  2. Flink 生态:Pulsar Connector 机制剖析
  3. 精彩回顾 | Apache Flink Meetup · 北京站(附PPT下载)
  4. 卧槽,又来一个 Java 大神器!!
  5. 360胡宁:通往CTO的道路上就是四个字
  6. 性能测试--jmeter中XPath断言【10】
  7. ad怎么导入cad的外形尺寸_EPLAN与传统CAD的性能比较分析
  8. python包裹和运费_使用shopifyapipython,添加新产品并注明价格和“需要运费”:Fals...
  9. 计算机应用中英文缩写ai表示,2010黑龙江省全国计算机等级考试二级VB笔试试卷及参考答案考试重点和考试技巧...
  10. 工具栏快速创建类_还费时费力找菜单栏中的工具?教你制作属于自己的快速访问工具栏...