下面那一个TCP/UDP端口范围将被客户端程序使用?

以前一个人写的一个文本协议分析平台。

2)支持 XML 格式及任意非 XML 格式流。
3)支持端口过滤、关键字过滤、方向过滤。
4)支持 BASE64 等多种编码内容的解码操作。
5)支持任意数量的哈希表、支持多种格式节点内容的存取。

//增加对XML文件的支持 //下面定义若干json字符串 //定义若干哈希表的字段的长度 //注意,下面这个结构体的源端口和目的端口没有任何实际意义,仅仅是一个字符串标识 //由于这里是做平台,所以不会考虑任何协议的端口,客户端,服务器,全部忽略!!! //在平台里,只能看到2个方向的流,不会看到任何东西 // 采用 左孩子,右兄弟的方式来存储 //根据配置文件得到的一些初始化信息及初始化之后的数据结构 //下面是一些测试数据 //下面是一些统计信息 //这里存储 著名端口 * 修改日期 版本号 修改人 修改内容 //表示需要写文件日志 //但是此时文件指针为空 //从左往右进行裂开,返回新的位置及长度 //首先判断参数的有效性 //务必要填写下面的2个数据,然后才能返回 //现在可以从左往右进行查找 //万事具备,开始查找 //无论找到与否,都需要更新split,以便继续查找下一个 split //从右边开始裂开,往左逼近 //保持原封不动的返回 //包含不可显示字符时也处理 //修改不可见字符映射,可见字符不映射 //将每个字符映射到[32,126]区间内 //可能某一段字符串中存在十六进制表示,也有十进制正常 //保留十进制字符串,将十六进制的转化为十进制 //注意,原先传进来的是一个以\0结尾的字符串,结束后也必须以\0结束 //先看是否可以找到[ //先把之前的若干个字符复制 // 十六进制的字符串转为十进制的字符串,注意,最后仍然需要以\0结束 //前提是必须以0x或者0X开头,并且长度是2的倍数 //确实是以 0x或者0X开头的 //十六进制的字符串转为十进制的数字 //将若干字节转化成数字 else //表明出错了,不是可识别的字符 //表示将当前字符串通过base64编码转化 //注意,一定要保证,转化后的长度务必要缩短,至少不会变长。 //如果存在76个字符加一个换行符的因素存在,则需要消除 //表明这里应用了规则: 每76个字符加入一个0d0a,要将此去掉 //复制当前的76个字符 //将剩下的字符完全复制过来 //根据目前对base64的理解,如果不是4的倍数的话 //那么现在可以放心大胆的进行base64解码了 //表明可以开始处理了 //支持以下几种字符的解码 //支持第一大类(转义字符) //表明当前是一个&,则判断 //现在增加对十六进制的处理 else//表明都匹配不上,直接复制 //此处支持多次解码,按照顺序来 //可以开始进行解码了 //无论是否有效,都更新decode //现在终于可以使用了 //进入这个函数的,按照目前的标准,都是字符串 //尚未对这个字符进行转码,需要根据情况来决定 //遍历删除此哈希表下面的节点 //表明这一个桶下面没有节点 //表明开始有节点,此时hashnode指向第一个节点 //然后现在只需要全心全意来处理temp节点即可 //然后再计算数据的长度 //再计算开始加入的时间 //执行完一轮后,需要休息一下,否则频繁的操作,会引起资源竞争,影响报文分析 //下面的函数实现从content中查找str, 并不保证两个字符串都以\0结尾 //此处返回的是字符串的偏移值 //查找最后一次出现的位置 //对于文本流,肯定是需要根据length规则来确定总长度的 //表明没有找到,则返回0 //表明没有找到,则返回0 //表明type是有定义的 //目前定义有效的值只有如下 // 2 根据某个长度的字节来计算 //表示是需要某个常值的 //表明没有定义这个值 //找到了,直接加上去 //表明需要根据当前的字节数来计算长度 //判断总长度是否有效 //表明总长度不够,继续等待 //表明是类似于MSN /ZTEIM 形式的变态求长度算法 //将endline的偏移量加上其前面的数字作为当前计算结果 //表明找不到这个字符串,则继续等待 //找到了,在剩下的内容中查找endline //表明找不到这个字符串,则继续等待 //接着开始计算前面的几个字符 //表明根本不存在之前的某个数字,则返回 //表明确实存在这个数字,下面想办法来提取这个数字 //这里容忍长度为0的情况 //表明是直接找到某个字符串就结束 //表明找不到这个字符串,则继续等待 //可能要引入协议号的判断 //前面会保证肯定存在common节点,所以这里不判断了 //表明找到了当前的节点类型 //寻找ticket的proto属性,分为大类编号和小类编号两种属性 // 开始填写主实体文件名 //写会话ID,同一个连接共一个会话ID //进来就需要先初始化 //一些循环使用的变量需要重新初始化 //表明不是一个有效的节点,比如注释节点之类的无效节点 //表示这个string 存在,则转化为阿拉伯数字 //表明是依靠字符串(begin---end)来取内容,那么下面的几个属性必须存在 //这里需要写入到相应的字段中去 //表明是通过ccks方式来查找目标字符串 //那就需要采用接口在某个字符串中查找字符 //表明曾经初始化过了 //表明之前确实初始化, 且初始化成功了 //现在终于可以放心的查找了 //如果长度为0,仍然表示没找到 //表明是通过常值来确定 //则首先判断value属性是否存在 //找到了,很好办,直接赋值 //报文的最后N个字符,N由 begin和end中间的字符串转化后的数字决定 // 这个内容是长度字符指定字段,那么下面的几个属性必须存在 //算出的长度不能超过总长度 //这里需要写入到相应的字段中去 //适用于从指定的某个下标开始的内容为Length+Value格式 //对于总长度是有要求的 //表明长度是可以的,则计算长度 //查看计算出来的结果是否正确 //适用于报文中存在一个html/xml标签格式的段 //然后提取最里面的文本(如果有多个,则只提取第一个) //考虑到可能存在属性 //都找到了,则是一个闭包的XML格式的字符串 //既然找到了这个闭包的字符串,则可以开始提取出文本 //再次保证长度不为0 //增加一种方式,从左往右开始裂开以及从右往左开始裂开 //适用于需要从左往右开始缩进,初始化为当前范围 //表示自动生成会话ID //先要获取客户端的IP //既然是服务器的端口,则需要用客户的端口 //当前就是客户的端口 //为了产生这个端口,不需要做转化 //如果有解码的需求,则需要在split之前进行解码,存储在本地 //注意,解码会破坏原本报文的结构,所以正常情况下,解码数据只能有一份存储 //如果查找成功,且存在split属性 //如果经过上述的操作,确实找到了数据,则更新到im_data里 //最终确定了,需要登记到im_data里 //目前的规则是当tag标签存在时,才写到ticket中 //之所以这么做,是为了给部分只能一次性提取的数据提供缓存空间,而不是写到详单里 //如果是通过普通方式,非哈希表中找到的数据,直接写入数据即可 //这里不要写任何数据 // 尽量从哈希表中查 //这里要注意,从哈希表中查到的数据,必须在释放哈希表节点前写到数据中 //而且从哈希表中找到的数据是绝对不会存入到im_data数组中 //这样做的目的是因为哈希表中的数据可能被别的线程使用,存入哈希表的数据 //到im_data数组可能造成脏数据 //表明没有找到数据, 尝试从哈希表中查找,注意,从哈希表中找数据不需要使用split属性 //表明之前的并没有查找成功,则判断是否需要从哈希表中提取 //表明都是有效的,则尝试去从哈希表中提取查找数据 //表明是依靠客户端IP来查找数据 //复制完毕后,需要查找这个数据 //务必要转化成主机字节序 //现在tempptr指向了数据起始位置 //这里必须在放弃哈希表的锁之前写入到相应的字段中去 //在哈希表,不能跳出哈希表再写 //必须先写,再跳出哈希表 //表明是依靠客户端IP+客户端的端口 // 先需要填充源IP //现在可以复制端口了 //现在可以复制端口了 //复制完毕后,需要查找这个数据 //务必要转化成主机字节序 //现在tempptr指向了数据起始位置 //这里必须在放弃哈希表的锁之前写入到相应的字段中去 //在哈希表,不能跳出哈希表再写 //必须先写,再跳出哈希表 //表明是依靠服务器IP+服务器端口 // 先需要填充源IP //现在可以复制端口了 //现在可以复制端口了 //复制完毕后,需要查找这个数据 //务必要转化成主机字节序 //现在tempptr指向了数据起始位置 //这里必须在放弃哈希表的锁之前写入到相应的字段中去 //在哈希表,不能跳出哈希表再写 //必须先写,再跳出哈希表 // 先需要填充源IP //再来确定较小的方向 //现在可以复制端口了 //现在可以复制端口了 //复制完毕后,需要查找这个数据 //务必要转化成主机字节序 //现在tempptr指向了数据起始位置 //这里必须在放弃哈希表的锁之前写入到相应的字段中去 //可能出现必填项没有找到的情况 //当前只负责产生hash_index针对字符串的 //对应于需要添加或者修改到哈希表中的场合 //取出各个属性并校验 //对每个属性是有一定的限制的,有很多限制,看其是否有效 // 1对于dataid //不能越界并且已经初始化了 // 对于TTL来说,要大于0 //对于hashtableid来说,要有效且被初始化过 //此时才完全可以添加到哈希表中 //添加时需要根据hashtype来决定组织哪些数据 //哈希表中的数据结构形式为 //注意!!!这里所有的数据都是网络字节序 //当前方向就是客户端 // 3接着写入数据的长度 // 4现在可以复制数据了 //表明没有空间供复制数据 // 6 开始写加入时间 // 表明现在可以复制TTL时间了 //现在所有的数据都准备好了,tempbufferUsedLen也已经准备好了 //但是有可能数据的长度超过了哈希表的最大长度,所以还需要比较 // 添加之前,如果有存在的,则必须先删除 //前面已经保证了添加的数据的长度不超过nodelength,所以这里是以最大长度添加 //注意!!!这里所有的数据都是网络字节序 //现在可以复制端口了 // 3接着写入数据的长度 // 4现在可以复制数据了 //表明没有空间供复制数据 // 6 开始写加入时间 // 表明现在可以复制TTL时间了 //现在所有的数据都准备好了,tempbufferUsedLen也已经准备好了 //但是有可能数据的长度超过了哈希表的最大长度,所以还需要比较 // 添加之前,如果有存在的,则必须先删除 //前面已经保证了添加的数据的长度不超过nodelength,所以这里是以最大长度添加 //客户端IP+客户端端口 //注意!!!这里所有的数据都是网络字节序 //当前方向就是客户端 //现在可以复制端口了 //现在可以复制端口了 // 3接着写入数据的长度 // 4现在可以复制数据了 //表明没有空间供复制数据 // 6 开始写加入时间 // 表明现在可以复制TTL时间了 //现在所有的数据都准备好了,tempbufferUsedLen也已经准备好了 //但是有可能数据的长度超过了哈希表的最大长度,所以还需要比较 // 添加之前,如果有存在的,则必须先删除 //前面已经保证了添加的数据的长度不超过nodelength,所以这里是以最大长度添加 //服务器IP+服务器端口 //注意!!!这里所有的数据都是网络字节序 //当前方向就是服务器 //现在可以复制端口了 //现在可以复制端口了 // 3接着写入数据的长度 // 4现在可以复制数据了 //表明没有空间供复制数据 // 6 开始写加入时间 // 表明现在可以复制TTL时间了 //现在所有的数据都准备好了,tempbufferUsedLen也已经准备好了 //但是有可能数据的长度超过了哈希表的最大长度,所以还需要比较 // 添加之前,如果有存在的,则必须先删除 //前面已经保证了添加的数据的长度不超过nodelength,所以这里是以最大长度添加 //注意!!!这里所有的数据都是网络字节序 //既然判断出来了较小的方向,就可以复制数据了 //现在可以复制端口了 //现在可以复制端口了 // 3接着写入数据的长度 // 4现在可以复制数据了 //表明没有空间供复制数据 // 6 开始写加入时间 // 表明现在可以复制TTL时间了 //现在所有的数据都准备好了,tempbufferUsedLen也已经准备好了 //但是有可能数据的长度超过了哈希表的最大长度,所以还需要比较 // 添加之前,如果有存在的,则必须先删除 //前面已经保证了添加的数据的长度不超过nodelength,所以这里是以最大长度添加 //暂时并未支持其它方式 //用来判断当前方向是否是著名端口 //理论上永远不会出现 //万事俱备,只欠东风 //表明存在哈希表节点 // 需要增加acl的处理 //表明存在acl的配置 //调用发送acl的函数 //过滤XML,看看是否通过过滤条件 //只负责处理,不负责清除内容,因为内容会在此函数调用后处理 //首先判断参数是否合法 //表明没有init子节点,那也不用初始化了 //终于找到了我所要的filter节点 //表示源端口为某个值 //表示目的端口为某个值,用于确定方向 //表示从某个偏移量开始的N个字节等于指定的值 //如果长度不够,也不用判断了 //表示2个端口之一为指定端口 //表明当前条件是满足的 //表明执行到发详单写文件函数 //表明当前条件是不满足的 //表明执行到发详单写文件函数 //表明是一个有效的字符串 //表明当前标签结束了 //但是有可能存在父亲节点,所以需要根据父亲节点的层次来判断 //此时已经可以返回了,返回时返回两种状态 //表明还存在多余的字符串 //则计算出当前的字符串长度 //表明在等待收到属性字符串 else //收到了有效属性字符 //收到这个字符时,不清楚当前的状态,需要根据后面一个字符来判断 //确实是起一个新的标签 innertext=1;//表示以后不写了,找到第一个就行了 //支持里面包含/字符 //已经收到了结束字符 //但是有可能存在父亲节点,所以需要根据父亲节点的层次来判断 //此时已经可以返回了,返回时返回两种状态 //表明还存在多余的字符串 //则计算出当前的字符串长度 //这种情况下只能是收到" //已经收到了属性内容的开始的" //这里不对属性字符串的内容做过多限制 // 1) 并列的数据之间用逗号(", ")分隔。 // 2) 映射用冒号(": ")表示。 // 3) 并列数据的集合(数组)用方括号("[]")表示。 // 4) 映射的集合(对象)用大括号("{}")表示。 * 功能描述: implatform读取报文,处理报文 * 修改日期 版本号 修改人 修改内容 //这里采用的是模拟数据 //表明取得了一个数据报文 //表明linkid不合法,直接返回 //如果是第一次来,则必须申请一个link_buffer //表明申请失败了,则返回 //表明申请成功了,则根据第一次的报文进行内容填充 // 下面开始解析报文 //表明是UDP的方式,需要采用UDP的方式来提取信息 //执行到这里,就保证了doublelink不为空 //表明还没有初始化数据区域 //则根据当前收到的第一个报文来初始化 //在收到第一个报文后,来初始化会话ID //这样还不足以产生唯一的,把微秒也加上 //把报文的方式填上来,是TCP或者UDP //这样就人为的定义了两个方向,实际上没有任何实际意义 // 4 保证当前方向的下一个期望序号已经被初始化 //表明还没有设置当前期望序号, 这里是以0代表未初始化 // 5判断当前序号是否我想要的,否则就丢弃 //表明乱序了,那么就删除之前的报文的痕迹,然后设置当前的报文信息 // 6到这里,报文确实是这个方向我想要的 //提前修正当前方向的期望seq //然后直接拿内容去做处理即可 //先保证当前的缓冲空间是存在的 //申请成功了,需要初始化一些东西 //到这里已经保证当前方向的缓冲区是存在的 //既然存在,则尝试复制当前报文进入到缓冲区里,如果不行,则全部清洗 //则复制当前报文进入缓冲区里 //表明当前的报文太大了,则丢弃所有报文,然后返回 //到这里,当前的报文复制成功了,则开始处理 //表明还没有确定是哪种报文类型,则需要通过下面的途径来确定 // 思路是查找,逐个比对,如果最终没有找到,则表明当前报文无法识别,则丢弃,清空缓冲区 //表明根本没有符合的报文类型匹配规则,则丢弃目前所有报文 //如果是udp的话,这里就不算总长度了,当前报文可以立即进入处理过程 //UDP不计算总长度 //因为一个UDP就是一个独立的处理单元 //处理完之后,丢弃目前所有内容,重新开始 //下面才是针对TCP的方式 //表明匹配到了某个规则,此时streamtype也保存起来了 //表明当前方向流的报文为XML格式的报文 //开始校验是否已经取得了一个完整的 XML格式的字符串 //表明当前报文是一个完整的真正XML报文,字符不多也不少 //表明当前报文缺少字符,非完整 //表明当前报文包含一个完整的报文,而且有更多的字符 //表明余下的报文可以匹配,且是XML流,则继续进入到XML流类型处理循环 //表明当前报文不符合XML规则,认为是错误,清除信息 //表明是其它文本类型 //对于其它文本类型,必须先按照规则确定出必须的长度 //如果之前没有计算过总长度,则现在计算 //这里计算的是完整的预期长度 //表明还没有足够的信息来计算出总长度,继续等待 //表明已经计算出了当前需要的总长度 //那就看当前报文总长度是不是所需要的 //表明报文还不够,那就继续等待 //处理完后,需要把剩余的内容复制过来并且初始化一些信息 //复制完毕后,需要设定一个\0 //表明余下的报文可以匹配 //不识别的类型,不处理 fail://主要置当前方向的缓冲区为初始状态 * 功能描述: implatform的执行初始化函数,比如创建哈希表 * 修改日期 版本号 修改人 修改内容 //在这里执行一些初始化信息,比如创建哈希表 //既然root不为空,则查找im节点 //表明没有init子节点,那也不用初始化了 //表明没有hashtables子节点,那也不用初始化哈希表了 //表明找到了hashtables节点,则遍历其下面的子节点来处理 //既然存在,那必须初始化哈希表 //只有当存在id属性的时候,才会进行哈希表的初始化 //视为普通的哈希表初始化 //为了让某个IP上的某个协议都共用1个共同的会话ID //表明所有的哈希表都创建完毕之后 //没有合适的哈希表作为talk id //所有的哈希表都已经初始化完毕,返回。 //接下来应该来创建连接管理的一些数据结构,参数也是从配置文件里获取 //这个肯定必须存在的,否则肯定要返回错误 //表明找到了link节点 //既然参数都正确,那就尝试获取连接信息的数组指针 //同时,还要申请出会话数组缓冲区 //继续申请每个流的缓冲区 //这种情况是无法容忍的,必须返回错误 //这里需要记录著名端口的问题 //这个肯定必须存在的,否则肯定要返回错误 //还需要看是否有更多的存储空间 //至此,所有的缓冲区全部申请成功了 //表明这里确实要做一个转换 //类似于MSN之类协议的规则 //转换endline,目前支持一个字符串 //如果出现id和succeedid相同的情况,直接返回错误 //相同,会出现死循环 //相同,会出现死循环 //表明确实存在,那就好办了 //表明曾经初始化过了 //现在终于可以设置了 //这里一定要返回错误,不然后面不知道是否正确处理 //之前是采用数组来存储指针 //后来修改为直接采用 //然后将tempnode看做是一个字符串来替换其属性 //对于每个data来说,只要存在split字符串,都要进行操作 //这里启动清除哈希表的线程 //初始化过了,且成功了,可以启动清除线程 //为了支持每个连接一个唯一的会话ID * 功能描述: implatform的读取配置文件的函数 * 修改日期 版本号 修改人 修改内容 // 1处理打开文件的代码 //表明打开配置文件成功了 // 2处理读取配置文件的代码 //表明读取配置文件失败了,可能配置文件格式不正确 //表明读取配置文件成功了 // 3将root指针赋值给全局变量,关闭文件句柄了,释放文件描述符及相关结构 //表明关闭文件失败了,晕,怎么会这样。。。 //表明关闭文件成功了 //重新设置相关变量为NULL; * 修改日期 版本号 修改人 修改内容 // 1第一步,读取配置文件 // 2第2步,根据配置文件,执行初始化任务,比如哈希表,连接内存分配 //后面的线程不用初始化了 // 这里开启N个清除哈希表的线程 // 3第3步,读取报文,进行处理 /* 队列为空, 睡眠10毫秒,然后再次检查 */

我要回帖

更多关于 TCP与UDP的联系 的文章

 

随机推荐