新闻中心
每一位客户都是我们的核心财富
行业动态云信公告
您当前位置:首页  > 新闻中心 > 云信公告

C语言在短信平台接口过滤系统设计中的应用

来源:原创    时间:2018-02-26    浏览:5311 次

    为了满足电信运营商或相关部门对不断扩大的短信业务进行有效监控和管理的需要,针对垃圾邮件和非法短信的需求,各种短信过滤技术层出不穷。作者参与了一个商业短信过滤系统的研究与开发,该系统采用了基于内容的过滤技术,包括预处理器、数据库服务器、过滤模块等。短信过滤数据库和用户管理程序等。短消息预处理器与短消息中心等数据源接口,收集和预处理所有短消息。将符合指定规则的文本消息(由用户管理程序设置)放入原始SMS数据库,并在后台发送到过滤模块。过滤模块根据存储在短信过滤数据库中的内容扫描方案和匹配规则对原始短消息进行过滤。

blob.png

    过滤结果存储在短消息过滤数据库中。用户管理程序提供用户的查询和管理功能。在系统的设计和测试过程中,预处理器与短消息中心和过滤模块的接口程序主要是用C语言编写的。如果接口程序不能正确读取原始消息,那么之后的过滤过程将毫无意义。过滤模块需要在短时间内完成大量短消息的处理。

    如果在程序设计中没有正确选择或使用库函数,就会导致系统效率低下,甚至导致系统崩溃。目前的文献主要集中在电子邮件、网络过滤技术上,对短消息过滤技术的讨论较少。由于其独特的记录格式,短信的读取和过滤方法有其独特的位置。本文分析了在短信过滤系统设计中如何正确选择和使用C标准库函数,以提高系统软件的可靠性。2.2C库函数在接口程序中的选择与应用短信过滤系统如何从短消息中心等数据源获取数据?一种常见的方法是,预处理程序通过FTPClient子模块从短信中心下载电话列表文件,并将其存储为本地文件,然后接口模块读取这些本地电话列表文件。

    提取短消息相关信息,转换格式,然后发送到过滤模块进行处理。文件名和记录格式定义得很清楚。通常,统计呼叫列表中的移动原始(由移动台发起)被选择作为下载数据源。

 例如,在调度中心的计费中,2.8版本的单字计费服务器生成CDR作为文本文件,每个记录、每个域记录以单个字节逗号(“,”)作为分隔符;用于输入(0X0D,0X0A)。字段类型为单个文件为字符串格式,源地址和目标地址为移动号码为9个~字符,#字符,字符串字符*组合;另一个是字符串格式。数字图书馆提供了许多读写文件数据的功能。一般情况下,常用的数据读取函数是读取顺序访问文件,数据从普通函数中读取随机存取随机文件,但对话单文件读取程序就是使用这两种功能。

    原因如下:虽然每个域记录(字段)都是字符串格式,但即使是同一属性的字段,也没有固定的字符数(通常只有最大限制),例如,该字段中相邻两个记录的目标地址,一些字符为11和20个。如果使用fcanf函数,则不指定字符的数目。字符在每个字段中阅读,逐字阅读是一个难点。

    虽然Fread函数有两个参数来确定读取的字节数,但是由于相同的属性在不同的域记录中的字节数是不确定的,因此不应该使用。为了解决这个问题,可以使用库函数fgetc编写一个函数来读取每个记录(字段)中的每个域,然后通过调用该函数,构造函数完成对每个记录的读取。下面给出的主要代码是.int ReadOneMenger(U8成员[],int成员len,file*fp){...。

    memset(成员,成员0,len);/*word,数组为0*/for(index=0;index=(Members len-1);index{temp=fgetc(Fp));if(temp==EOF)返回读取失败;/*如果文件或读取错误发生,子函数返回失败指示*/ethif(temp=‘temp==0x0D temp==0x0D temp==0x0A’,断开);/*如果分隔符或输入一个新行,则从循环中读取*/etc的域。成员[index]=temp/*;否则,字符将被顺序地读取到数组,一个完整的域(字段)*/},通过调用此函数...}//end,您可以将每个域的成员放入与给定结构对应的记录中,以跟踪分析过程。

    应该指出,在读取文本消息内容字段时不能使用此函数。由于文本消息内容可能包含分隔符或回车返回行字符,因此调用此函数会导致文本消息内容(例如遇到的分隔符)的不完整读取,因此我跳出循环,开始读取下一个域,并导致文件被错误地读取,从而无法正确读取后续数据。读取此项需要特殊的构造函数。为了提高接口程序的鲁棒性,必须增加文件读取的容错处理。

    我们可以将读取的字段与电话列表文件中的相应字段进行比较,以确定是否存在读取错误,当我们发现错误时,根据列表格式的特点搜索下一条正确的记录也是明智的(因为账单本身可能是错误的,为了系统的可靠性和效率,明智的做法是放弃发生读取错误的记录。自然,它与字符串处理库中的比较函数memcmp或strcmps相关联。但我们不建议在设计容错处理时使用它们。

    例如,账单列表中每个记录的第一个项目(域)是收入。收入是一天的8位数,收入是10位数)。例如,我们可以将收入前两个字符中的两个字符组成的字符串与“20”进行比较。

    如果它不相等,我们可以判断是否发生了读取错误。此时,您可以使用memcmp或strncmp函数,但当出现误读时,例如,当您将调用列表的“提交时间”(例如:2004/10/1114:35:02)读到收入时,您只能将其进行上面的比较,并且找不到读取错误,因为字符//‘只出现在提交时间。但是在收益方面,我们可以使用库函数strstrt来确定字符收入读取是否包含字符,如果包含了,就意味着出现了读取错误。

    此外,经过测试,我们可以使用函数strstr来计算收入上出现的字符串“20”的位置。要确定是否存在读取错误,主要代码如下:...const char str[]=“20”ReadOneMemberany Bill g-SequenceNumnence NDig.Reada/pdest01strst char*)任何票据msg序列序列//*判断出现在#inside_Person1#char*中的“20”位置)任何票证单符号符号-序列数字,“/”是否有字符/a/a/a/a/f/P/P/0/01!)任何Bill msg-SequenceNum pdest02!{do{JudgeAdwe=Adust FirstMenger(任意Bill msg-SequenceNumnum//更正函数IFF getct finder EOF断开;}(JudgeAdwe==RETV调整假中断;}r/L结束,如果收入与格式不匹配,则使用更正函数查找下一个收入,直到您阅读格式收入/Readone Memberany Bill msg-SMIDN 11 fin.r.*继续读取其他记录。此功能可用于读取账单的容错处理。

    过滤模块中库函数的选择和应用,由于需要在短时间内处理大量的短信相关信息,有必要在设计初期对模块中将要用到的库函数进行比较。查看哪种库功能可以给模块带来更高的效率。过滤模块必须处理来自预处理模块的短信信息,并将信息存储在缓冲区中,过滤后还将过滤后的信息发送到短信过滤数据库,构建多个函数来完成上述功能,必须调用库函数具有以下功能,这些函数至少有三个:memcpysscanf和strncpy,它们在调用不到10000次时基本相同。在计算机上运行所需的时间并没有太大的不同,但是当电话数超过100000时,差异是显而易见的。编写了测试代码,比较了三个库函数的执行效率。

    测试环境:普通桌面(处理器:奔腾Rn 4 CPU 2.40 G.物理内存:KB,硬盘:80GN,操作系统Microsoft Windows 2000,程序运行环境:MicrosoftVisualC6.0.复制字符)。字符串作为匹配效率测试。

    测试结果时间效率比较1从测试数据中运行100000 500000 2,000,000次运行时间/ms memcpyscanfstrncpy 11,表明当操作函数运行超过500000次时(例如,二百万倍于memcpy的执行效率(仅考虑时间,在筛选模块中,经常调用比较两个字符数组之间大小的库函数)。我们编写了测试代码来比较mem-CMP函数和strncmp函数,测试结果如表2所示。表2时间效率比较2运行100000 500000 2,000,000次。当这两个函数运行二百万次时,MEM-CMP的执行效率高于其它函数。

    值得注意的是,只考虑效率,选择库函数是片面的。各种图书馆功能都有自己的应用范围和环境。方案编制应根据需要进行综合考虑(例如,具有系统特点、技术实施计划等),选择更适当的功能,不一定是运行最快的功能。结论只有一个方面,我们应该对C标准库在编程中提供的丰富的库功能有一个更全面的理解。

    本文以短信过滤系统的设计为例,介绍了在短消息中心接口和过滤模块的程序设计中如何选择合适的库函数来构造功能。我们设计的系统可以处理最多5000/s/s,平均2500/s/s,并且在没有额外维护的情况下稳定工作一个月。为了验证这些功能的有效性和鲁棒性,满足了要求。