linux 并发服务器:
1 背景简介
H330S模块集成海兴HXE110/HXE310电表后出现批量无法上线,问题原因在于3G芯片异常(在此不做详细描述),由于客户现场电表大部分已经安装,考虑拆装成本问题需要远程升级。
3G芯片支持foat远程升级,通过控制芯片或主机向3G芯片下发AT指令,激活ppp拨号同时绑定并发服务器IP和端口,3G芯片会主动连接并发FTP服务器进行报文交互升级。WINDOWS版本并发服务器已开发,由于客户现场大部分为LINUX服务器,所以要求开发出LINUX平台下用于H330S升级服务器程序。
2 整体框架说明
2.1 设备关系图
主要有ZTE主站抄表控制系统,通过网页服务器控制电表系统和MCU版本升级程序下发,电表HXE310、HXE110安装覆盖整个国家,FTP服务器为LINUX虚拟机,带宽和内存配置良好位于能源公司机房。
2.2 升级基本流程
如下图所示,从主站上导入MCU升级程序并触发MCU升级事件,主站会下发MCU升级包到电表主控芯片MCU,电表靠3G芯片上网传输数据。MCU升级完成后重启设备同时检测3G芯片版本,若非指定版本则控制3G芯片升级,下发FTP 服务器IP和端口,3G芯片自动与FTP服务程序进行连接升级,数据中断有重连机制。
3 Linux服务器程序设计
3.1 需求说明
1.升级3G芯片并发数量理论值1000个
2.与3G芯片数据包交互稳定采用TCP/IP模型
3.运行环境中CPU 2核以上,内存高于1G,上行带宽高于2M
3.2 服务器模型选型
3.2.1 Select
Select实现I/O端口复用是通过轮询检测I/O事件实现,文件描述符由于机制限制为1024直接限制并发数,I/O事件检测有三种读事件、写事件、异常事件。分别对应读、写、异常三个字符集。
#include <sys/select.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
3.2.2 Epoll
Epoll I/O多路复用技术是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
两种工作模式如下:
LT模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。
ET模式:当epoll_wait检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。
ET模式在很大程度上减少了epoll事件被重复触发的次数,因此效率要比LT模式高。epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
未采用原因是由于短时间内未调通,该模式最优。不支持windows,linux内核2.6以上,移植性差。
3.2.3 线程池
1.进程中创建线程的限制
默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
2.资源消耗及要求过高,包括内存及处理器,线程创建与销毁,资源分配与释放在实现上比较麻烦
3.短期调试未实现,未采用
3.3 FTP服务程序框架
3.3.1 TCP/IP建立连接
流程图如下:
Step1:ftp server主函初始化
Step2:ftp server创建TCP/IP服务端模型
Step:3:3G modem与FTP进行TCP/IP三次握手
Step4:建立连接后按foat协议栈协议交互升级
3.3.2 FTP SERVER实现
Step1:入参检测,具体格式如下
./gserver 4 10.0.25.151 5050 500 H330S_V2H.00.23.bin modem_success.xls
arg1: Service program of the executable (./gserver)
arg2: Output log level set(default 4)
arg3: Server ip address (eg. xxx.xxx.xxx.xxx) , note that 127.0.0.1 is not allowed
arg4: Server port for upgrade service(eg. 8031), note that this port must be different from the one used by DMS
arg5: The maximum number of access(eg. 50), note that this parameter is affected by the network bandwidth and CPU computing performance
arg6: Upgrade file name (eg. H330S_V2H.00.23.bin)
arg7: The upgrade log file(eg. modem_success.xls) , module's upgrading log will be append to this file
Step2:程序初始化
Set_print_log:设置打印级别,0-4一共五个级别,对调试信息,过程信息,错误提示,异常信息,重要日志做出区分。
loadUpdateFiles:加载升级文件到内存,先创建副本文件,后将副本导入到内存。以共享内存方式实现多个事件读取升级文件,保证原文件不被破坏。
Malloc(events):初始化events全局结构体,该结构体的功能是存储所有单个连接客户端的重要属性,包括套接字,ip,port,sn,imei,开始时间,结束时间等
Step3:建立TCP/IP服务器端模型,等待客户端连接
略
Step4:while循环检测接入客户端
Select:从读写字符集检测事件,带阻塞。包含三种字符集,读事件、写事件、异常事件
Accept:新接入客户端,将fd写入读字符集和写字符集
Recv:非新接入客户端,调用协议栈函数处理业务,若为升级完成指示0X14,从读写字符集中删除客户端fd
3.3.3 守护进程实现
Step1:手动远程到ftp 服务器执行./runstart.sh &后台运行
Step2:若脚本或程序已经运行,提示已经运行或请运行runstop.sh停止程序后再次运行
Step3:若程序运行失败,端口被占用,大量连接未释放导致绑定失败,执行runstop.sh
Step4:while循环检测,120s检测一次若程序异常退出,无可执行程序进程则尝试运行,若失败等120s再次尝试。若程序正常运行,则跳过
- Linux 并发服务器编程(多进程)
文章目录 说明 注意事项 server.c client.c 运行截图 说明 在Linux中通过流式套接字编程(TCP),实现一个并发服务器的访问回显,适合刚学完Linux套接字编程的朋友进行巩固训练 ...
- Linux 并发服务器雏形总结
如下介绍一个并发回射客户端/服务器的雏形,所谓回射:就是客户端输入一条数据,服务器端读取并显示,然后服务器端再把刚读取的信息发送回客户端进行显示.示意图如下: 所谓并发服务器:就是一个服务器可以同时为 ...
- LINUX环境并发服务器的三种实现模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1 循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...
- Linux客户/服务器程序设计范式1——并发服务器(多进程)
引言 本文会写一个并发服务器(concurrent server)程序,它为每个客户请求fork出一个子进程. 注意 1. 信号处理问题 对于相同信号,按信号的先后顺序依次处理.可能会产生的问题是,正 ...
- Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)
转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...
- Linux网络编程客户\服务器设计范式
1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今 ...
- Linux网络编程服务器模型选择之并发服务器(上)
与循环服务器的串行处理不同,并发服务器对服务请求并发处理.循环服务器只能够一个一个的处理客户端的请求,显然效率很低.并发服务器通过建立多个子进程来实现对请求的并发处理.并发服务器的一个难点是如何确定子 ...
- Linux下几种并发服务器的实现模式
Linux下的几种并发服务器的设计模式 1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. ...
- linux学习之高并发服务器篇(二)
高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...
随机推荐
- C语言写了一个socket client端,适合windows和linux,用GCC编译运行通过
////////////////////////////////////////////////////////////////////////////////* gcc -Wall -o c1 c1 ...
- docker OCI runtime
Open Container Initiative(OCI)目前有2个标准:runtime-spec以及image-spec.前者规定了如何运行解压过的filesystem bundle.OCI规定了 ...
- linux centos挂载数据盘教程
一.备份/home/liying目录数据前提条件:电脑重启下,保证服务关闭,以免进程影响操作 a.新建backup目录#cd /#mkdir backup b.把/home/liying/目录下的数据 ...
- hibernate对连接池的支持和HQL查询
hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...
- 作用域中LHS查询和RHS查询
LHS查询:赋值操作左侧的查询,LHS查询试图找到变量的容器本身,,从而对其赋值. RHS查询:赋值操作右侧的查询,可以理解为"取到某某的值" 举例: function foo(a ...
- find_package()的查找*.cmake的顺序
1. find_package(<Name>)命令首先会在模块路径中寻找 Find<name>.cmake,这是查找库的一个典型方式.具体查找路径依次为CMake: 变量${C ...
- postgresql 清空数据表数据
在 mysql中,只需要执行: TRUNCATE table_name; 即可,数据会情况,而且自增id也会变回0: 但在 postgresql 则稍有不同,因为 postgresql 的自增id是通 ...
- SpringBoot入门 (十一) 数据校验
本文记录学习在SpringBoot中做数据校验. 一 什么是数据校验 数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数 ...
- 如何替代即将淘汰的Flash方案?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由MarsBoy发表于云+社区专栏 | 导语 Web技术飞速发展的如今,我们在感受新技术带来的便捷和喜悦的同时,也时常在考虑着一个问题: ...
- Tomcat学习总结(2)——Tomcat使用详解
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...