收藏 分销(赏)

短信网关设计方案报告.doc

上传人:w****g 文档编号:2504349 上传时间:2024-05-30 格式:DOC 页数:56 大小:900.54KB 下载积分:14 金币
下载 相关 举报
短信网关设计方案报告.doc_第1页
第1页 / 共56页
短信网关设计方案报告.doc_第2页
第2页 / 共56页


点击查看更多>>
资源描述
项目设计汇报 上海易嵌 项目名称: 短信收发系统设计 项目责任人: 汤汝 项目时间: 组员: 邵林、陈阳、余刚 目录 概要设计部分 3 一、设计需求 3 用户端要求 3 服务端要求 3 限制性需求 4 项目分配情况 4 二、体统总体结构图 5 三、模块介绍 5 1.服务器 5 2. 协议层 8 3. 应用层模块 11 具体设计部分 13 一、 服务器设计和分析(责任人:余刚) 13 服务器应用层输入输出 13 模块功效函数 13 二、协议层设计和分析(责任人:汤汝) 21 1.用户端注册模块 21 2.用户端数据处理模块: 25 3.用户端打包解包模块 28 4.服务端收发模块 29 三、应用层设计和分析(责任人:邵林、陈阳) 32 1. 各函数模块介绍 32 1.1短信设置模块 32 1.2短信编辑模块 35 1.3短信操作模块 36 1.4保留模块 39 2. 视图模块正确构建 42 2.1已发件箱 42 2.2 初稿箱模块 43 2.3 写信箱 44 2.4 发件箱模块 45 2.5 收件箱模块 45 2.6 短信设置模块 46 2.7 自定义文件夹模块 47 概要设计部分 一、设计需求 使用TCP/IP协议模拟GSM协议设计短信收发系统。 用户端要求 1. 用户端第一界面为写短信,收件箱,发件箱,已发件箱,初稿箱,短信设置。用户可自定义文件夹。 2. 写短信界面进入后需要输入收件人和短信内容,收件人能够从电话本模块中选择,也能够直接输入号码,如输入号码和电话本中存在统计匹配,需直接显示为电话本中姓名,输入完成后可进行发送操作或存入初稿箱。 3. 收件箱中存放从网络端收到短信,收件箱中短信根据接收时间排序,未读短信需要被标识。对收件箱操作包含删除短信(包含单条删除,多条删除和全部删除),显示短信数量,按发件人排序。单独对每个短信条目标操作包含删除,回复,转发,查看信息详情,将发件人保留至电话本,将短信内容中号码保留至电话本,将短信条目移至自定义文件夹。 4. 发件箱中保留正在发送中短信,如发送成功,则短信转存至已发件箱中。如发送失败,则短信仍保留在发件箱中。对发件箱操作包含删除短信(包含单条删除,多条删除和全部删除),显示短信数量。单独对每个短信条目标操作包含删除,转发,发送。 5. 已发件箱中保留发送成功短信,对已发件箱操作包含删除短信(包含单条删除,多条删除和全部删除),显示短信数量,按收件人排序。单独对每个短信条目标操作包含删除,转发,查看信息详情,将收件人保留至电话本。 6. 初稿箱存放短信编辑初稿,对初稿箱操作包含删除短信(包含单条删除,多条删除和全部删除),显示短信数量。单独对每个短信条目标操作包含删除,发送。 7. 自定义文件夹由用户定义,用户可定义自定义文件夹名称。对自定义文件夹操作包含删除文件夹,删除短信(包含单条删除,多条删除和全部删除),显示短信数量。对单条短信操作同收件箱。用户可定义多个自定义文件夹。 8. 短信设置中条目项为 是否匿名发送,目前容量显示,自定义文件夹管理,是否开启发送汇报,短消息服务中心设置,信息使用期,短信黑名单功效。自定义文件夹管理包含创建自定义文件夹,重命名自定义文件夹,删除自定义文件夹。 服务端要求 服务器端需实现接收,存放和转发三种基础功效。另需依据SMS协议标准实现延时发送,定时发送,匿名发送,短信屏蔽功效。服务器端需开启守护进程。 短信服务器: A、提供用户管理表 B、提供短信发送日志并通知是否抵达用户手机 C、提供短信接收日志并响应用户端程序连接请求 D、短信内容服务可关键分为点播和订阅两张,点播类型随机发生,用户需要该信息临时点播,为一次性服务,订阅信息由用户定制订阅关系,服务方按时向全部订阅者发送一样信息 E、手机用户在申请使用服务方所提供信息服务前,需要注册。注册中要对手机用户进行验证,验证经过后注册成功 限制性需求 1 短信字符编码要求依据SMS协议实现。 2 用户端电话本条数最大200条。用户端短信最大条目数为300条。最大条目数指全部短信文件夹内包含条目数总量。服务器端存放容量不做限制。 四 安全性及可靠性需求 1 要求网络传输非明码传输,并确保网络传输数据之可靠性。 2 要求服务器端稳定安全。 3 要求用户端存放安全。 项目分配情况 责任人 任务 备注 汤汝 总体设计汇报,协议层设计汇报,和实现和调试,应用层电话簿功效实现。 确保协议层实现,负责审核各个模块设计,提供参考性意见。 余刚 服务器设计汇报,服务器实现和调试。 确保服务器稳定安全。 陈阳、邵林 应用层设计汇报,应用层实现和调试。 良好界面控制,程序稳定和安全。 全体组员 对项目进行综合性调试和测试。 确保实现基础功效前提下进行版本升级。 二、体统总体结构图 三、模块介绍 1.服务器 责任人:余刚 服务器设计为多线程程序,每次用户注册后创建线程为其提供服务。每次用户退出结束结束服务线程。服务器运行开启守护进程,负责写日志和清理到期发送失败短信。 其响应步骤图以下: 每次用户开机时全部和服务端建立连接,检验服器失败队列中是否有自己消息。服务器收到后保留该用户id号到数组中,并统计总个数。当用户关机后,服务器和她断开连接,删除数组中id号,并个数减一。 线程接收短信包后提取目标地址,分析目标地址,设置源地址,转发;线程处理步骤以下: 接收模块:当用户发送信息报时,服务器接收并保留。 解析模块:将信息报信息解析出来(包含目标地址,源地址,大小,内容)存入结构体中。 发送模块:将结构体发送到目标地址。提供短信发送日志并通知是否抵达用户手机 发送失败分析: 1. 若对方手机未开机,则服务器保留消息,等候用户开机后再发送。 2. 若是网络问题则重新发送,并确定是否接收成功。 服务器数据结构: Struct list_fail_pack *head //失败队列头节点(全局) #define total 100 //服务器能接收用户端个数 int count 统计目前连接用户个数 Struct client{ Int client_fd;//套接字描述符 Char number[12];//电话号码 Pthread_t thread_id;//线程ID Struct client *next; }; //用户连接时发送给服务器结构体,统计用户信息 Struct list_head{ Struct list_head *prev; Struct list_head *next; }; Struct fail_pack{ Struct client_send_pack tmp; Struct time timestamp; };//发送失败后保留结构体 Struct list_fail_pack{   Struct List_head list_h;   Struct fail_pack f_pack; };//建立失败内容链表 2. 协议层 协议层分为用户端和服务器两种;总共有两个线程,其中接收线程一直存在系统中阻塞读取端口信息,接收到信息后解压解密后发送给应用层。发送线程由用户调用接口函数后开启发送线程,取得发送内容后压缩加密后再打包,发送至服务端。 Struct client_send_pdu_head{//用户发送数据包头部 Unsigned char sca[13]; Unsigned char pdu_type; Unsigned char mr; Unsigned char da_len;//目标地址长度 Unsigned char da_type; Unsigned char da[11];//目标地址 Unsigned char pid; Unsigned char dcs; Unsigned char vp; Unsigned char udl;//用户数据长度 }; Struct client_recv_pdu_head{//用户接收数据包头部 Unsigned char sca[13]; Unsigned char pdu_type; Unsigned char oa_len;//源地址长度 Unsigned char oa_type Unsigned char oa[11];//源地址 Unsigned char pid; Unsigned char dcs; Unsigned char scts[7]; Unsigned char udl;//用户数据长度 }; Struct client_send_pdu{//用户端发送数据包 Struct client_send_pdu_head head; Char buffer[140]; }; Struct client_recv_pdu{//用户端接收数据包 Sturct client_recv_pdu_head head; Char buffer[140]; }; 协议层模块图: 用户端协议层: 服务端协议层: 服务器协议需要修改数据包头部信息,在将发送用户填充到源地址里去; 用户端协议层接口: /*应用层发送接口*/ Unsigned int app_send(const char *app_buf, \ size_t buf_len,const char *number); /*应用层接收接口*/ Unsigned int app_recv(char *app_buf,size_t buf_len,char *number); 服务器协议层接口: /*服务器发送接口*/ Unsigned int ser_send(int dest_sockfd, \ struct client_recv_pdu *temp, \ size_t temp_size,\ const char *src_number); /*服务器接收接口*/ Unsigned int ser_recv(int src_sockfd, \ struct client_send_pdu *temp, \ size_t temp_size); 3. 应用层模块 短信系统设计 短信应用层概要步骤图。应用层包含收件箱、写短信、发件箱、初稿箱、已发件箱、短信设置和私密信箱(自定义文件夹)七大功效,每个功效有各自子功效。应用层经过两个进程进行短信收发及其它信息传输。应用层将短信信息及多种标志传输给协议层,协议层经过处剪发送给服务器,服务器经过处理后发送到指定用户端,经协议解析后发送给应用层。应用层读取信息并显示给用户。 应用层运行设计: 应用程序由系统开机时开启协议层进程,短信进程和电话簿进程;其中开启协议层进程时注册用户到服务器;和服务器建立连接;短信进程中建立接收线程,阻塞接收服务器短信服务信息。在调用发送函数时,开启发送线程,发送完成结束发送线程。电话簿进程提供联络人信息。 应用层运行步骤图: 应用层数据结构: typedef struct msm{//短信结构体 char phnoenum[11]; //存放电话号码 char time[15];//存放时间字符串,将时间命名为文件名 char *message; //存放短信内容 }MSM; 具体设计部分 一、 服务器设计和分析(责任人:余刚) 服务器应用层输入输出 服务器输入项:协议层向服务器输入短信内容和目标号码和服务器名字。协议层向服务器输入传输过来短信包。 服务器输出项:服务器向协议层输出短信内容和来信人地址,并向源用户端输出发送信息情况提醒。 模块功效函数 /*功效:该线程获取当初时间,并检验失败队列每个节点时间戳,*若时间戳失效则删除该节点. *Struct list_fail_pack *head:失败队列头节点。 *成功:1;失败:-1 */ Int Over_time(Struct list_fail_pack *head); 步骤图: /*功效:删除失败队列中某个节点。 *Struct list_fail_pack *head :失败队列头节点。 *Struct list_fail_packtemp:要删除节点。 *返回值:成功返回1,失败返回-1 */ Int del_failpack(Struct list_fail_pack *head,Struct list_fail_pack *temp); 步骤图: /*函数功效:用户退出时删除注册表统计。 *struct client head 注册表数组头地址; *pthread_id:要退出用户线程号。 *成功:返回1;失败:-1 */ Int del_login(struct client head,thread_t pthread_id) 步骤图: /*函数功效:获取源地址。 形参列表:struct client *head 注册表数组头地址。 Unsigned Char *number:得到号码。 Int Client_fd:用户套接字。 返回值:成功:1;失败:-1*/ Int get_src_addr(struct client *head, \ Unsigned Char *number,int client_fd); /*函数功效:获取目标地址。因为包内地址是用数组存放,所以 *要先取得号码长度len,在获取号码并将号码以字符串形式存放。 *struct client_send_pdu temp :用户发送过来包节点。 *Unsigned Char *dest_addr:取得目标地址。 *成功为1;失败:-1 */ Int get_dest_addr(struct client_send_pdu *temp, \ Unsigned Char *dest_addr); 步骤图: /*函数功效:获取消息内容 *形参列表: struct client_send_pdu temp //用户发送过来包节点。 *char *message:获取消息; *返回值:成功:0;失败:-1 */ Int get_message(struct client_send_pdu *temp ,char *message); /*功效:将用户地址,线程号,sock_fd放入struct client结构体中。 *形参列表:head:注册表数组头地址,将新产生节点插入链表; *返回值flag:用来判定注册是否成功:1:成功,-1:失败 */ Int login_user_list(struct client *head); 步骤图: /*函数功效:发送信息后返回给用户信息. 参数:struct client_send_pdu *tmp要返回包。 int flag=login_user_list().flag=1,将原包buffer改为success返回; flag=-1,将包buffer改为fail并将包发回对方*/ Void Return_to_srcuser(struct client_send_pdu *tmp ,int flag) 步骤图: /*函数功效:ser_recv()接收到包后,经过get_dest_addr取得目标地址*查看是否是发给服务器信息,还是发送给其它人.若是发送给服 *务器,解析信息内容(a.点播;b.注册)。不然直接发出去。 *参数:struct client_send_pdu *tmp:协议发来包。 *返回值:1:成功;-1:失败 */ Int isfirst_login(struct client_send_pdu *tmp); 步骤图: /*函数功效:将取得包发送给目标地址. 解析包取得目标地址,和 *注册表里地址匹配,若有,取得fd并发送出去;若无,将包放入*Struct list_fail_pack失败链表中. *将要发送出去包结构体struct client_send_pdu *tmp。 *目标地址:unsigned char *dest_addr *返回值:成功:1;失败:-1*/ Int send_out(struct client_send_pdu *tmp,unsigned char *dest_addr) ; 步骤图: /*函数功效:查找在注册表内是否有目标地址。 *参数:unsinged char *dest:目标地址. * struct client *head:注册表头节点。 *返回:成功:返回struct client *tmp;失败:-1 */ Int Find_dest_addr(unsinged char *dest, struct client *head); 步骤图: /*函数功效:提供给注册函数调用。用户开机和服务器连接时查询服*务器失败队列中是否有自己消息。有就发送。 *参数:unsigned char *src:用户地址. *List_head *head:失败队列头节点 *返回值:1:成功;-1:失败*/ Int inquire_message(unsigned char *src, struct client_send_pdu *head); 步骤图: /*功效:遍历失败队列,取得时间戳。 * 参数:struct client_send_pdu *head.:失败队列头; * unsigned char *time:取得时间戳 * 返回值:1:成功;-1:失败。 */ Int inquire_failpack_time(struct client_send_pdu *head, unsigned char *time) 步骤图: /*函数功效:用户连接时判定服务器是否接收 *参数:count:目前连接个数。 * Total:总共能够接收队列 *返回值:1:成功;-1:失败 */ Int Iseccept_client(int count,int total ) 步骤图: 二、协议层设计和分析(责任人:汤汝) 协议层功效描述:协议层分为用户端协议和服务端协议,用户端协议关键负责对用户应用程序所需要发送数据进行处理,处理模式符合标准短信协议。而且和网络层进行通信,和服务器建立连接。含有极佳通用性和可移植性。经过接口和其它层进行通信。服务器协议层关键工作在于和网络层进行通信,和修改包头部信息。 协议层输入项:应用层向协议层输入短信内容和目标号码和服务器名字。网络层向协议层输入传输过来短信包。 协议层输出项:协议层向应用层输出短信内容和来信人地址。协议层向网络层输入需要发送短信包。 协议层接口和各个功效函数以下: 1.用户端注册模块 /* *user_register实现用户在服务器注册功效 *const char *servicer_name是服务器名字; *const char *number是用户电话号码,作为服务器查找用户唯一凭证 *电话号码最长11个字符; *const char *usrname是用户用于实名注册用用户名; *函数连接成功返回0(SUCCED); *连接失败,返回3(FAIL); *服务器已满,返回1(FULL); *服务器拒绝,返回2(REFUSE); */ int user_register(const char *servicer_name, \ const char *number, \ const char *usrname); 实现步骤图: /* *test_number用于检测号码是否正当; *const char *number是用户提供号码; *号码长度不正当,返回1(ERR_LEN); *非法字符,返回-1(ERR_CHAR); *正当返回0(NOERROR); */ int test_number(const char *number); 实现步骤图 /* *register_pack_set设置注册用数据包,目标地址为服务器号码00000, *内容为号码和用户名; *struct client_send_pdu *send_pack是用户发送数据包; *const char *number是用户号码, *const char *usrname是用户名,临时不提供实名注册; *成功返回0; *失败返回1; */ int register_pack_set(struct client_send_pdu *send_pack, \ const char *number,const char *usrname); 实现步骤图: /* *reply_pack_analysis用于解析用户端回复使用数据包; *struct client_recv_pdu *send_pack是用户接收数据包; *成功注册:返回0(SUCCED); *拒绝注册:返回1(REFUSE); *服务器已满:返回2(FULL); */ int reply_pack_analysis(struct client_recv_pdu *recv_pack); 实现步骤图: 2.用户端数据处理模块: /* *app_send给应用层提供发送接口; *const char *app_buf是应用层数据指针; *size_t buf_len 应用层数据大小; *const char *dest_number 目标地号码; *成功返回发送字节数; *失败返回-1; */ int app_send(const char *app_buf, \ size_t buf_len,const char *dest_number); 实现步骤图: /* *encrypt_app_data对应用层要发送数据进行加密处理; *char *send_buf是应用层需要发送数据 *size_t buf_len是用户数据大小; *该函数加密成功返回加密后数据大小; *失败返回-1; */ int encrypt_app_data(char *send_buf,size_t buf_len); 实现步骤图: /* *compress_app_data实现对应用层数据进行压缩; *即去掉每个字节第八位 *char *send_buf是已加密应用层数据 *size_t buf_len 是buf大小 *成功返回压缩后数据大小 *失败返回-1; */ int compress_app_data(char *send_buf,size_t buf_len); /* *app_recv给应用层提供接收接口 *char *app_buf 是应用层用于保留短信内容buffer *size_t buf_len 应用层buffer大小 *char *src_number 是用于保留源地址号码 *成功返回接收字节数; *失败返回-1; */ unsigned int app_recv(char *app_buf, \ size_t buf_len,char *src_number); 实现步骤图: /* *decompress_prol_data用于解压协议层接收到数据; *char *recv_buf 待解压数据 *size_t buf_len 待解压数据大小 *char **dest_data_p 用于保留解压后数据地址; *函数实施成功返回解压后数据大小; *函数实施失败返回-1; */ int decompress_prol_data(char *recv_buf, \ size_t buf_len,char **dest_data_p); /* *decrypt_prol_data用于解密短信内容; *char *recv_buf是接收到数据内容地址 *size_t buf_len内容大小; *函数实施成功返回解密后数据大小 *函数实施失败返回-1; */ int decrypt_prol_data(char *recv_buf,size_t buf_len); 实现步骤图: 3.用户端打包解包模块 /* *package_pdu用于打包已处理好应用层数据, *char *send_buf 已处理发送数据 *size_t buf_size 是已处剪发送数据大小; *char *dest_number 目标地电话号码; *函数实施成功返回打包好包地址 *失败返回NULL */ struct client_send_pdu* package_pdu(char *send_buf, size_t buf_size, \ char *dest_number); 实现步骤图: /* *unpacking_pdu用于拆分接收到pdu包; *char *recv_buf用于保留接收到短信内容 *char *src_number用于保留源号码 *函数实施成功返回短信内容大小; *函数实施失败返回-1; */ int unpacking_pdu(char *recv_buf,char *src_number, \ Struct client_recv_pdu *recv_pack); 实现步骤图: 4.服务端收发模块 /* *ser_send函数给上层提供接口 *int dest_sockfd是目标套接字 *struct client_recv_pdu *temp需要转发pdu包 *size_t temp_size temp大小; *const char* src_number 发送者号码; *函数成功返回发送字节数 *失败返回-1; */ int ser_send(int dest_sockfd, struct client_recv_pdu *temp, \ size_t temp_size,\ const char *src_number); 实现步骤图: /* *change_pdu_head函数在转发时修改pdu头信息; *send_pack是存放待发送包地址 *temp是服务端接收时数据包 *src_number是来自于发送端源地址 *函数成功返回send_pack大小 *失败返回-1; */ int change_pdu_head(struct client_recv_pdu *send_pack, \ struct client_send_pdu *temp, \ const char *src_number); 实现步骤图: /* *ser_send函数给上层提供接口 *int dest_sockfd是接收地址套接字 *struct client_send_pdu *temp存放接收短信包地址 *size_t temp_size temp大小; *函数成功返回接收字节数 *失败返回-1; */ unsigned int ser_recv(int src_sockfd, \ struct client_send_pdu *temp, \ size_t temp_size); 实现步骤图: 三、应用层设计和分析(责任人:邵林、陈阳) 函数中使用 #define NOT_SET 0 //没有设置或不是黑名单之类 #define BLACKLIST_SET 1 //开启黑名单功效 #define IS_BLACKLIST 2 //是黑名单 #define REPORT_MESSAGE 3 //开启消息汇报 #define ANONYMOUS 4 //匿名发送 1. 各函数模块介绍 1.1短信设置模块 /* *功效:判定黑名单是否开启; *@blacklist_set 在该函数中定义一个int型变量; *输入开启1或0,将输入值赋给blacklist_set; *判定blacklist_set是0还是1; *是1,则将宏定义开启 BLACKLIST_SET赋给blacklist_set; *是0,则将宏定义关闭NOT_SET赋给blacklist_set; * 返回值为blacklist_set; *@ BLACKLIST_SET=1,为开启黑名单; *@ NOT_SET=0,为关闭黑名单; */ void blacklist_open(); /* *功效: 检测收件人是否是在黑名单中 *打开黑名单目录文件,将文件名存放到字符数组; *遍历查找,假如存在则删除该条短信(返回一个标志IS_BLACKLIST); *假如不存在则保留到收件箱文件中; *假如在黑名单中就删除该短信, *@msm表示收到短信结构体; */ int in_blacklist (MSM *msm); /* *功效:判定是否开启消息汇报函数 *@report_message 为在该函数中定义一个int型变量; *输入开启0或3,将输入值赋给report_message; *判定report_message是0还是3; *是3,则将宏定义开启 REPORT_MESSAGE赋给report_message; *是0,则将宏定义关闭NOT_SET赋给report_message; * 返回值为report_message; *@ REPORT_MESSAGE=1,宏定义为开启消息汇报; *@ NOT_SET=0,宏定义为关闭消息汇报; */ int report_message_open(); /* *功效:判定短信是不是消息汇报; *调用 report_message_open()函数返回值REPORT_MESSAGE或NOT_SET判定*是否开启了消息汇报; *开启了消息汇报,则利用strcmp(MSM* *msm->phonenum,); *当结果为0时,表示为消息汇报,显示“消息发送成功”; *当结果不为0时,则为短息,不显示任何内容,进入收信箱; */ void report_message(); 1.2短信编辑模块 /* *功效:编辑短信收件人号码函数; *该函数中使用switch()语句来判定是输入号码还是姓名; *@case 1:调用get_number(char *number, char *name)得到号码; *@case 2:调用get_name(char *number, char * *name)得到联络人; *输入完号码按回车键调用电话簿中get_number(char *number, char *name);*查看电话本中是否有和该号码匹配电话号码; *没有该号码,则继续输入; *有该号码时,则调用电话簿中号码; *当输入是姓名按回车键调用电话簿中get_name(char *number, char * * name)函数,匹配联络人姓名; *@phonenumber为收件人号码,函数返回该号码 *函数返回值为需要输入号码 */ char *edit_phonenum(char *phonenumber); /* *函数功效:写短信内容 *@ text,将短信内容赋值到text; *text作为编辑内容返回值返回; */ char *edit_text(char *text); 1.3短信操作模块 /* *功效:选择对应下标选择对应短信 *具体操作:打开文件,读取目录文件中短信名到一个数组中; *显示数组组员并显示其下标; *选择对应短信文件名,并返回对应下标,关闭文件 *@filename对应目录文件名 *@num为选汉字件对应下标 *返回值: 返回对应下标 */ int select_one(const char *fliename); /* *功效:选择多条短信 *打开目录文件中短信文件名读取到数组中; *选择需要选择对应下标赋值到对应新数组select里面; *函数返回选择对应下标数组指针 *@filename对应目录文件名 *@select指针用于保留选择对应下标 *返回值: 函数返回选择对应下标数组指针 */ int *select_many(int *select,const char *fliename); /* *功效描述:删除单条短信及其在该文件目录中全部信息; *打开目录文件,将内容保留到数组; *调用select_one()函数返回值作为选择对应下标; *调用系统函数system("rm -rf ...")删除数组中对应下标对应短信; *并删除对应数组中对应短息文件名; *更新数组,将更新数组重新写入对应目录文件中; *并对对应文件中短信数目减1 *@filename为目录文件名 */ void delete_one(const char *fliename); /* *函数功效:删除多条短信; *打开目录文件,并将文件中短信文件名存入一个数组1中; *经过调用选择多个函数select_many()返回存入短信文件名数组2; *删除文件数组对应文件名及短信内容; *并更新数组1中内容; *将数组1中内容及内容个数利用w+追加方法存到对应目录文件中 *@filename为
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服