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.多路 ...
随机推荐
- Git使用、Git配置、Git提交代码、Git上传
非教程,只是自己的一个简单笔记.建议没有入门的朋友,直接看git的官方help文档: https://help.github.com/articles/set-up-git 1.注册一个git账号,超 ...
- 跨站请求伪造(CSRF攻击)理解
一 概念 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的 ...
- Identity Server4学习系列二之令牌(Token)的概念
1.简介 通过前文知道了Identity Server4的基本用途,现在必须了解一些实现它的基本细节. 2.关于服务端生成Token令牌 头部(Header): { “typ”: “JWT”, //t ...
- css - bootstrap3下拉菜单点击之后怎么改变背景颜色?
css添加 .navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, .n ...
- Shell脚本 | 性能测试之启动流量
安卓应用的流量统计有多种方式,点击「阅读原文」可以看到一篇别人写的文章,关于安卓流量数据的获取,写的挺全的,列举了几种不同方式的优劣.(见文末参考链接) 今天我要分享的是通过脚本一键获取应用的启动流量 ...
- Hibernate的执行流程和集合的映射关系
Hibernate的执行流程 集合映射 准被hibernate的运行环境 配置hibernate.cfg.xml主配置文件 1.Set集合 写User.java类 package com.gqx.co ...
- Ansible-安装-秘钥-部署-使用
本文转自:https://www.cnblogs.com/ylqh/p/5902259.html ansiblemaster:192.168.74.146 ansibleslave1 :192.168 ...
- css3 2D转换(2D Transform) 动画(Animation)
transform 版本:CSS3 内核类型 写法 Webkit(Chrome/Safari) -webkit-transform Gecko(Firefox) -moz-transform Pres ...
- CRM项目分析建表
这个CRM项目是我们学习一年多以来,第一次团队合作完成的项目!之前的项目都是做半个月的,但是都是自己单独完成一套项目的!这次我们还是做半个月的!但是我们是分工合作的!自己所完成的内容都是不同的!我觉得 ...
- tomcat之日志切割
日志分割 场景:日志量比较大,且研发程序没有设置分卷 1.配置样例: 文件路径:/etc/logrotate.d/tomcat /data/logs/catalina.out { daily comp ...