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&mdash;&mdash;并发服务器(多进程)
引言 本文会写一个并发服务器(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.多路 ...
随机推荐
-
Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
-
启动受管服务器出现:unable to get file lock, will retry...
启动受管服务器出现:unable to get file lock, will retry... 解决方法:一.删掉Domain下的*.lok文件1. 删除edit.lok进入到domain_home ...
-
支持自动切换的tab标签代码札记
html代码如下: <!-- tab标签代码begin --> <div class="tab1" id="tab1"> <div ...
-
JMeter使用技巧
在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享.本文内容如下. 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Deb ...
-
Berkeley DB数据处理
设计一个结构,利用Berkeley DB完成大数据的存储,备份,查询功能. 已有的储备: 1.Berkeley DB的基本操作. 2.数据转存后数据不丢失. 3.过百GB以上数据的存储. 数据流如下, ...
-
Android运行时注解
Android的注解有编译时注解和运行时注解,本文就介绍下运行时注解. 其实非常简单,直接上代码:本文主要是替代传统的findViewById()的功能,就是在我们Activity中不需要再使用fin ...
-
SHA1l加密
public static string SHA1Encrypt(string sourceText) { SHA1 sha = new SHA1CryptoServiceProvider(); AS ...
-
after及before伪元素及解决父元素塌陷的几种方法
一.伪类和伪元素 CSS中伪类和伪元素有很多,也很好用!如果熟练使用的话可以解决很多问题 首先明白什么是伪类:伪类是基于当前元素的状态,而不是元素的id class等静态标志,它是动态变化的,它会在一 ...
-
plsql 根据sid连接oracle
ORCL73 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.73)(PORT = 152 ...
-
[转载]彻底卸载oracleXE数据库服务器
URL:http://www.2cto.com/database/201306/216182.html