基于socket报文的数据解析
- 格式:doc
- 大小:24.50 KB
- 文档页数:5
sock的知识点总结1. Sock 的概念和作用Sock 是 Socket 的简称,它是在网络编程中非常重要的概念,它提供了一种通信机制,使得计算机之间可以进行数据交换。
Sock 的主要作用包括:建立连接、传输数据、断开连接等。
它为应用层提供了数据传输的能力,同时也可以实现基于 TCP 或 UDP 的各种协议。
2. Sock 的类型Sock 可分为两种类型,分别是面向连接的 Socket 和面向无连接的 Socket。
面向连接的Socket 是指通过建立连接来进行数据传输,它使用 TCP 协议进行通信;而面向无连接的Socket 是指不需要事先建立连接,可以直接进行数据传输,它使用 UDP 协议进行通信。
面向连接的 Socket 保证了数据的可靠传输,但是会有一定的延迟;而面向无连接的Socket 则具有高效的特点,但是不保证数据的可靠性。
3. Sock 的地址在网络通信中,Sock 的地址包括主机地址和端口号。
主机地址用来标识网络中的计算机,而端口号则用来标识计算机上的不同进程。
主机地址和端口号组合在一起,就可以唯一确定一台计算机上的一个进程。
在建立 Sock 连接时,需要指定对方的主机地址和端口号,以便进行通信。
4. Sock 的创建和使用在编程中,要使用 Sock 进行网络通信,需要经过一系列的步骤来创建和使用 Sock。
首先需要创建一个 Sock,然后绑定地址和端口号,接着监听连接请求或者发起连接请求,最后进行数据传输和断开连接。
在 C 语言中,可以使用 socket() 函数来创建 Sock,bind() 函数来绑定地址和端口号,listen() 函数来监听连接请求,accept() 函数来接受连接请求,connect() 函数来发起连接请求,send() 函数和recv() 函数来进行数据传输,close() 函数来断开连接。
5. Sock 的通信模式Sock 的通信模式包括客户端-服务端模式和对等通信模式。
socket函数的三个参数标题:socket函数的使用方法导语:在计算机网络中,socket函数是一种用于实现网络通信的编程接口。
它是网络应用程序与网络之间的通信端点,通过socket函数可以实现进程间的通信和数据传输。
本文将详细介绍socket函数的三个参数的使用方法,帮助读者理解并能够灵活应用socket函数。
一、参数一:domain(套接字的协议域)在socket函数中,参数domain指定了套接字的协议域。
协议域是一组协议的集合,它定义了套接字可以用于通信的协议类型。
常用的协议域包括AF_INET(IPv4协议)、AF_INET6(IPv6协议)、AF_UNIX(本地通信协议)等。
1. AF_INET(IPv4协议)在使用IPv4协议进行通信时,可以使用AF_INET作为套接字的协议域。
IPv4协议是当前广泛应用的网络协议,它使用32位地址来标识网络中的主机。
2. AF_INET6(IPv6协议)当需要使用IPv6协议进行通信时,可以选择AF_INET6作为套接字的协议域。
IPv6协议是IPv4协议的升级版,它使用128位地址来标识网络中的主机,解决了IPv4地址不足的问题。
3. AF_UNIX(本地通信协议)如果需要在同一台主机上的进程之间进行通信,可以选择AF_UNIX 作为套接字的协议域。
AF_UNIX提供了一种本地通信的方式,不需要通过网络传输数据。
二、参数二:type(套接字的类型)在socket函数中,参数type指定了套接字的类型。
套接字的类型决定了套接字的工作方式和特性。
常用的套接字类型包括SOCK_STREAM(流式套接字)和SOCK_DGRAM(数据报套接字)。
1. SOCK_STREAM(流式套接字)当需要建立可靠的、面向连接的通信时,可以选择SOCK_STREAM作为套接字的类型。
流式套接字提供了一种面向连接的、可靠的通信方式,数据按照顺序传输,不会丢失和重复。
2. SOCK_DGRAM(数据报套接字)如果需要进行无连接的、不可靠的通信,可以选择SOCK_DGRAM作为套接字的类型。
Socket(套接字)是一种编程接口,它允许应用程序通过网络进行通信。
它是网络编程中的重要组成部分,提供了一种通用的方式来创建网络连接、发送和接收数据,以及处理网络通信。
Socket 底层原理涉及到操作系统的网络协议栈。
当应用程序创建一个 Socket 时,操作系统会为其分配一个文件描述符,这个文件描述符与网络连接相关联。
通过这个文件描述符,应用程序可以使用标准的文件 I/O 函数(如 read()和 write())来发送和接收数据。
在底层,Socket 利用了 TCP/IP 协议栈来实现网络通信。
当应用程序通过 Socket 发送数据时,数据会被封装成 TCP 或 UDP 数据包,然后通过网络传输到目标主机。
目标主机接收到数据包后,操作系统会将其传递给相应的应用程序,应用程序可以通过读取文件描述符来获取接收到的数据。
Socket 还提供了一种机制来指定网络通信的目标地址和端口。
应用程序可以通过指定IP 地址和端口号来创建一个连接到特定主机和端口的 Socket。
这样,应用程序就可以与其他网络应用程序进行通信。
总的来说,Socket 是一种底层的网络编程接口,它利用操作系统的网络协议栈来实现应用程序之间的网络通信。
通过创建 Socket、指定目标地址和端口,以及使用文件 I/O 函数来发送和接收数据,应用程序可以进行网络通信。
socket数据传输原理在计算机网络中,Socket是网络通信的一种机制,它用于在不同的主机之间传输数据。
Socket数据传输原理可以分为以下几个步骤:1.建立连接:客户端与服务器之间通过Socket建立连接。
客户端通过调用Socket库函数创建一个Socket对象,并指定服务器的IP地址和端口号。
服务器通过调用Socket库函数创建一个Socket对象,并绑定到一个指定的IP地址和端口号上。
当客户端向服务器发起连接请求时,服务器会接收到该连接请求,并返回一个表示连接已建立的Socket对象。
2.数据读写:一旦连接建立,客户端和服务器可以通过各自的Socket对象进行数据读写操作。
客户端可以向服务器发送数据,服务器可以接收数据并进行处理;服务器可以向客户端发送数据,客户端可以接收数据并进行处理。
这些数据可以是文本、图片、音视频等任意类型的数据。
3.数据分片传输:当数据传输量较大时,Socket会将数据分成多个较小的数据包进行传输。
这样可以避免网络拥塞和数据丢失的问题。
发送方将数据分片并打包成数据包,然后依次发送给接收方。
接收方在接收到数据包后进行解包,恢复原始数据。
4.数据确认和重传:在数据传输过程中,接收方会向发送方发送一个确认消息,表示已成功接收到数据。
如果发送方没有收到接收方的确认消息,或者接收方接收到的数据包有误,发送方会根据一定的策略进行重传,以确保数据的可靠传输。
5.连接关闭:当数据传输完成或者不再需要进行数据传输时,客户端和服务器可以通过调用Socket对象的关闭方法来关闭连接。
关闭连接后,客户端和服务器将无法进行数据传输。
总体而言,Socket数据传输原理是通过建立连接、数据读写、数据分片传输、数据确认和重传以及连接关闭等步骤来实现数据在网络中的传输。
2022年职业考证-软考-信息安全工程师考试全真模拟易错、难点剖析B卷(带答案)一.综合题(共15题)1.单选题已知DES算法S盒如下,如果该S盒的输入为001011,则其二进制输出为()。
问题1选项A.1011B.1100C.0011D.1101【答案】B【解析】本题考查分组密码算法DES的S盒。
S盒的输入长度等于6,6个比特的第一和第六比特代表行,题中所给为01 (十进制为1),中间4个比特代表列,题中所给为0101 (十进制为5),因此对应上述S盒中的元素值为12,表示为二进制即为1100。
答案选B。
2.单选题2016年11月7日,十二届全国人大常委会第二十四次会议以154票赞成、1票弃权,表决通过了《中华人民共和国网络安全法》。
该法律第五十八条明确规定,因维护国家安全和社会公共秩序,处置重大突发社会安全事件的需要,经()决定或者批准,可以在特定区域对网络通信采取限制等临时措施。
问题1选项A.国务院B.国家网信部门C.省级以上人民政府D.网络服务提供商【答案】A【解析】本题考查《中华人民共和国网络安全法》。
《中华人民共和国网络安全法》第五十八条:因维护国家安全和社会公共秩序,处置重大突发社会安全事件的需要,经国务院决定或者批准,可以在特定区域对网络通信采取限制等临时措施。
故本题选A。
点播:《中华人民共和国网络安全法》已于2017年6月1日起实施。
为加强网络安全教育,网络空间安全已被增设为一级学科。
3.单选题僵尸网络是指采用一种或多种传播手段,将大量主机感染bot程序,从而在控制者和被感染主机之间形成的一个可以一对多控制的网络。
以下不属于僵尸网络传播过程常见方式的是()。
问题1选项A.主动攻击漏洞B.恶意网站脚本C.字典攻击D.邮件病毒【答案】C【解析】本题考查僵尸网络方面的基础知识。
僵尸网络在传播过程中有如下几种手段:主动攻击漏洞、邮件病毒、即时通信软件、恶意网站脚本、特洛伊木马。
答案选C。
socket使⽤TCP协议时,send、recv函数解析以及TCP连接关闭的问题Tcp协议本⾝是可靠的,并不等于应⽤程序⽤tcp发送数据就⼀定是可靠的.不管是否阻塞,send发送的⼤⼩,并不代表对端recv到多少的数据.在阻塞模式下, send函数的过程是将应⽤程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存⼤⼩⽐请求发送的⼤⼩要⼤,那么send函数⽴即返回,同时向⽹络中发送数据;否则,send向⽹络发送缓存中不能容纳的那部分数据,并等待对端确认后再返回(接收端只要将数据收到接收缓存中,就会确认,并不⼀定要等待应⽤程序调⽤recv);在⾮阻塞模式下,send函数的过程仅仅是将数据拷贝到协议栈的缓存区⽽已,如果缓存区可⽤空间不够,则尽能⼒的拷贝,返回成功拷贝的⼤⼩;如缓存区可⽤空间为0,则返回-1,同时设置errno为EAGAIN.linux下可⽤sysctl -a | grep net.ipv4.tcp_wmem查看系统默认的发送缓存⼤⼩:net.ipv4.tcp_wmem = 4096 16384 81920这有三个值,第⼀个值是socket的发送缓存区分配的最少字节数,第⼆个值是默认值(该值会被net.core.wmem_default覆盖),缓存区在系统负载不重的情况下可以增长到这个值,第三个值是发送缓存区空间的最⼤字节数(该值会被net.core.wmem_max覆盖).根据实际测试,如果⼿⼯更改了net.ipv4.tcp_wmem的值,则会按更改的值来运⾏,否则在默认情况下,协议栈通常是按net.core.wmem_default和net.core.wmem_max的值来分配内存的.应⽤程序应该根据应⽤的特性在程序中更改发送缓存⼤⼩:socklen_t sendbuflen = 0;socklen_t len = sizeof(sendbuflen);getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);printf("default,sendbuf:%d/n", sendbuflen);sendbuflen = 10240;setsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, len);getsockopt(clientSocket, SOL_SOCKET, SO_SNDBUF, (void*)&sendbuflen, &len);printf("now,sendbuf:%d/n", sendbuflen);需要注意的是,虽然将发送缓存设置成了10k,但实际上,协议栈会将其扩⼤1倍,设为20k.-------------------实例分析---------------在实际应⽤中,如果发送端是⾮阻塞发送,由于⽹络的阻塞或者接收端处理过慢,通常出现的情况是,发送应⽤程序看起来发送了10k的数据,但是只发送了2k到对端缓存中,还有8k在本机缓存中(未发送或者未得到接收端的确认).那么此时,接收应⽤程序能够收到的数据为2k.假如接收应⽤程序调⽤recv函数获取了1k的数据在处理,在这个瞬间,发⽣了以下情况之⼀,双⽅表现为:A. 发送应⽤程序认为send完了10k数据,关闭了socket:发送主机作为tcp的主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对⽅的ack),并且,发送缓存中的8k数据并不清除,依然会发送给对端.如果接收应⽤程序依然在recv,那么它会收到余下的8k数据(这个前题是,接收端会在发送端FIN_WAIT1状态超时前收到余下的8k数据.), 然后得到⼀个对端socket被关闭的消息(recv返回0).这时,应该进⾏关闭.B. 发送应⽤程序再次调⽤send发送8k的数据:假如发送缓存的空间为20k,那么发送缓存可⽤空间为20-8=12k,⼤于请求发送的8k,所以send函数将数据做拷贝后,并⽴即返回8192;假如发送缓存的空间为12k,那么此时发送缓存可⽤空间还有12-8=4k,send()会返回4096,应⽤程序发现返回的值⼩于请求发送的⼤⼩值后,可以认为缓存区已满,这时必须阻塞(或通过select等待下⼀次socket可写的信号),如果应⽤程序不理会,⽴即再次调⽤send,那么会得到-1的值, 在linux下表现为errno=EAGAIN.C. 接收应⽤程序在处理完1k数据后,关闭了socket:接收主机作为主动关闭者,连接将处于FIN_WAIT1的半关闭状态(等待对⽅的ack).然后,发送应⽤程序会收到socket可读的信号(通常是 select调⽤返回socket可读),但在读取时会发现recv函数返回0,这时应该调⽤close函数来关闭socket(发送给对⽅ack);如果发送应⽤程序没有处理这个可读的信号,⽽是在send,那么这要分两种情况来考虑,假如是在发送端收到RST标志之后调⽤send,send将返回-1,同时errno设为ECONNRESET表⽰对端⽹络已断开,但是,也有说法是进程会收到SIGPIPE信号,该信号的默认响应动作是退出进程,如果忽略该信号,那么send是返回-1,errno为EPIPE(未证实);如果是在发送端收到RST标志之前,则send像往常⼀样⼯作;以上说的是⾮阻塞的send情况,假如send是阻塞调⽤,并且正好处于阻塞时(例如⼀次性发送⼀个巨⼤的buf,超出了发送缓存),对端socket关闭,那么send将返回成功发送的字节数,如果再次调⽤send,那么会同上⼀样.D. 交换机或路由器的⽹络断开:接收应⽤程序在处理完已收到的1k数据后,会继续从缓存区读取余下的1k数据,然后就表现为⽆数据可读的现象,这种情况需要应⽤程序来处理超时.⼀般做法是设定⼀个select等待的最⼤时间,如果超出这个时间依然没有数据可读,则认为socket已不可⽤.发送应⽤程序会不断的将余下的数据发送到⽹络上,但始终得不到确认,所以缓存区的可⽤空间持续为0,这种情况也需要应⽤程序来处理.如果不由应⽤程序来处理这种情况超时的情况,也可以通过tcp协议本⾝来处理,具体可以查看sysctl项中的:net.ipv4.tcp_keepalive_intvlnet.ipv4.tcp_keepalive_probesnet.ipv4.tcp_keepalive_time////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////thread-1446913-1-1.html发送成功只是表⽰发到了内核socket缓冲区此时如果close,正常情况会进⼊TIME_WAIT状态,在此状态,对端可以继续接收数据但是如果发送⽅的接收缓冲区还有未读数据,就会⾛异常close的途径,置RST,⽴刻结束连接,没有TIME_WAIT状态。
Socket报⽂和端⼝测试⼯具的开发(提供源码)因为⾃⼰经常做Socket开发,经常要调试和维护多个服务器端和客户端的通信、报⽂数据等,⽹上的⼯具都是功能简单,⽤的不爽,所以⼀直都想⾃⼰写⼀个。
年底不忙了,终于写了⼀个,提供给⼤家使⽤,源码可以随便使⽤和修改,欢迎多提意见,让这个⼯具更易⽤,⽅便Socket编程开发⼈鱼。
主要的功能如下:1.建⽴Socket测试服务器端和测试客户端,并向其他端发送或接受报⽂数据,⽀持⾃动发送和⾃动应答,⽀持UDP和TCP;2.录⼊的IP地址和端⼝等参数数据进⾏本地XML序列化,下次⾃动打开。
(这个是我需要的,不⽤每次都录⼊各种IP地址端⼝了);3.接受或发送的报⽂数据,可以直接保存在⽇志⽂件当中,便于离线分析。
4.服务器端,可以查看接⼊的各个连接信息;5.⽀持AscII和16进制的数据发送和接收显⽰。
由于界⾯要同时⽀持TCP和UDP的数据通信,所以编写了两个接⼝IServer和IClient,便于界⾯和通信层分开。
public interface IServer{//初始化void Init(string serverIp, int port);//从服务器端给某个连接发送数据void Send(string connId, byte[] data, int length);//监听int Listen();//得到当前的连接List<IConnection> GetConnectionList();//Socket事件event ReceivedHandler OnDataReceived;event SocketErrorHandler OnSocketError;void Close();}为了保存参数数据,所以构造了⼀个SocketInfo类,对应客户端和服务器端,然后将这个集合序列化到XML⽂件中。
序列化的代码如下:[Serializable]public class SocketInfo{public string Name { get; set; }//Server端或客户端类型public string Type { get; set; }//16进制格式或AscIIpublic string Format { get; set; }public string ServerIp { get; set; }public int Port { get; set; }//TCP或UDPpublic string Protocol { get; set; }//报⽂数据public string Data {get;set;}//是否⾃动发送或接收数据public Boolean IsAuto {get;set;}public SocketInfo(){Format = "AscII";Protocol = "Tcp";Port = 8890;ServerIp = "127.0.0.1";Data = "请录⼊测试数据";}}public class MySerializer{public static void Serialize<T>(T value, string xmlFileName){if (value == null){return;}XmlSerializer serializer = new XmlSerializer(typeof(T));XmlWriterSettings settings = new XmlWriterSettings();settings.Encoding = new UnicodeEncoding(false, false);settings.Indent = false;settings.OmitXmlDeclaration = false;FileStream fs = new FileStream(xmlFileName, FileMode.OpenOrCreate);serializer.Serialize(fs, value);fs.Close();}public static T Deserialize<T>(string xmlFileName){if (string.IsNullOrEmpty(xmlFileName)){return default(T);}XmlSerializer serializer = new XmlSerializer(typeof(T));//XmlSerializer serializer = new XmlSerializer(typeof(ArrayList));XmlReaderSettings settings = new XmlReaderSettings();//settings.FileStream fs = null;try{fs = new FileStream(xmlFileName, FileMode.Open);// Deserialize the content of the XML file to a Contact array// utilizing XMLReaderXmlReader reader = new XmlTextReader(fs);T contacts = (T)serializer.Deserialize(reader);return contacts;}catch (FileNotFoundException){// Do nothing if the file does not exists}finally{if (fs != null) fs.Close();}return default(T);}}客户端的报⽂和服务器端的报⽂数据存放在Client.log和Server.log两个⽂件当中.主要是借助了Log4net的配置实现的. <log4net><root><level value="ALL"/><appender-ref ref="RollingFileAppender"/></root><appender name="ClientLogFileAppender" type="log4net.Appender.RollingFileAppender"><param name="File" value="client.log"/><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><appendToFile value="true"/><rollingStyle value="Size"/><maxSizeRollBackups value="3"/><maximumFileSize value="2MB"/><staticLogFileName value="true"/><layout type="yout.PatternLayout"><conversionPattern value="记录时间:%date ⽇志:%message%newline"/></layout></appender><logger name="SocketTool.ClientForm"><level value="DEBUG"/><appender-ref ref="ClientLogFileAppender"/></logger><appender name="ServerLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="server.log"/><lockingModel type="log4net.Appender.FileAppender+MinimalLock"/><appendToFile value="true"/><rollingStyle value="Size"/><maxSizeRollBackups value="3"/><maximumFileSize value="2MB"/><staticLogFileName value="true"/><layout type="yout.PatternLayout"><conversionPattern value="记录时间:%date ⽇志:%message%newline"/></layout></appender><logger name="SocketTool.ServerForm"><level value="DEBUG"/><appender-ref ref="ServerLogFileAppender"/></logger></log4net>。
Nodejs环境实现socket通信过程解析结构:socket是应⽤层和传输层的桥梁。
(传输层之上的协议所涉及的数据都是在本机处理的,并没进⼊⽹络中)涉及数据:socket所涉及的数据是报⽂,是明⽂。
作⽤:建⽴长久链接,供⽹络上的两个进程通信。
nodejs环境下的简单通信。
代码:serve:// 1 引⼊模块const net = require('net');// 2 创建服务器let clientArr = [];const server = net.createServer();// 3 绑定链接事件server.on('connection',(person)=>{console.log(clientArr.length);// 记录链接的进程person.id = clientArr.length;clientArr.push(person);person.setEncoding('utf8');// 客户socket进程绑定事件person.on('data',(chunk)=>{console.log(chunk);clientArr.forEach((val)=>{// 数据写⼊全部客户进程中val.write(chunk);})})person.on('close',(p1)=>{clientArr[p1.id] = null;} )person.on('error',(p1)=>{clientArr[p1.id] = null;})})server.listen(800);client:// 1 引⼊模块const net = require('net');const readline = require('readline');// 2 创建套接字和输⼊输出命令⾏let rl = readline.createInterface({// 调⽤std接⼝input:process.stdin,output:process.stdout})let client = new net.Socket();// 3 链接client.connect(800,'localhost');client.setEncoding('utf8');client.on('data',(chunk)=>{})client.on('error',(e)=>{console.log(e.message);})// 绑定输io流事件,获取输⼊输出字符rl.on('line',(mes)=>{client.write(mes);})⼩结:server端:绑定连接事件 --> 在连接事件中管理客户端进程对象(1,把添加到数组中 2,处理客户端发来的数据)-->开启端⼝监听请求。
Pos机收单系统性能压力测试实战Socket协议测试Loadrunner脚本+8583报文解析Action:#define _EOF '#'#include "lrs.h"Action(){char *recvbuf;int recvlen=0;int rc;lr_start_transaction("Trans_1");lrs_set_recv_timeout (60,0);lr_start_transaction("Conn_1");rc=lrs_create_socket("socket0","TCP","LocalHost=0","RemoteHost=192.168.205.150:7001",LrsLastArg);//RemoteHost处填入被测程序所在服务器IPlr_output_message("%d",rc);if (rc != 0 ) {lr_end_transaction("Conn_1", LR_FAIL);lr_end_transaction ("Trans_1", LR_FAIL);return 0;}lr_end_transaction("Conn_1", LR_PASS);//判断socket是否链接成功的事务lr_rendezvous("集合点");lrs_send("socket0","buf0", LrsLastArg);lrs_receive ("socket0","buf1",LrsLastArg);lrs_get_last_received_buffer("socket0",&recvbuf,&recvlen);if(recvlen==130)lr_end_transaction("Trans_1", LR_PASS);elselr_end_transaction ("Trans_1", LR_FAIL);//判断返回信息的长度是否正确,recvlen处填入预期返回信息的长度lrs_close_socket("socket0");return 0;}Data.ws:;WSRData 2 1send buf0 211"\x00\xD1"//报文xx"\x60\x00\x09\x00\x00"//TPDU信息"\x4C\x52\x49\x00\x1C\x00\x00\x00\x21\x58\x77\x96\x98\x00\x00\x00\x21\x 58\x77\x09\x79\x58\x00\x09\x49\x00\x06\x00\x00\x00\x22\x00\x30"//主被叫号码"\x01\x00""\x02\x00"//信息类型"\x70\x38\x05\x80\x30\xC0\x80\x19"//位图"\x19\x09\x55\x10\x04\x91\x00\x01\x35\x38\x52"//卡号"\x00\x00\x00"//处理代码"\x00\x00\x00\x00\x02\x00"//交易金额"\x00\x00\x14"//系统跟踪号"\x16\x41\x32"//本地交易时间"\x05\x20"//本地交易日期"\x00\x22"//服务点输入方式"\x00\x09"//NETWORK INTERNATIONAL IDENTIFIEER"\x14"//服务点条件代码"\x37\x09\x55\x10\x04\x91\x00\x01\x35\x38\x52\xD0\x00\x02\x20\x36\x00\x 60\x00\x00"//二磁道数据"\x01\x04\x99\x95\x51\x00\x49\x10\x00\x13\x53\x85\x2D\x15\x61\x56\x00\x 00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x21\x41\x41\x40\x00\x01\xD0\x00\x00\ x00\x00\x00\x0D\x00\x00\x00\x00\x00\x00\xD0\x00\x00\x00\x36\x00\x60\x00"//三磁道数据"\x32\x30\x31\x30\x30\x36\x30\x31"//收卡单位终端标识码"\x30\x30\x34\x31\x31\x30\x30\x34\x35\x31\x31\x30\x30\x31\x32"//收卡商户定义码"\x01\x56"//交易货币代码"\x00\x00"//RESERVED PRIVATE"\x00\x15\x30\x30\x30\x30\x30\x31\x30\x30\x31\x30\x30\x30\x30\x30\x32"//RESERVED PRIVATE"\x61\x54\x70\xE7\x33\x6D\xB5\x48"//消息认证码recv buf1 130-1发送报文原文:00DCC030C852D852D4001D0000D035470E7336DB548是16进制的,每两位代表一个字符,所以在Loadrunner里面发送数据的应该每两位前面家转义符“\x”来代表16进制。
基于socket报文的数据解析
摘要:目前国内外大多数实时监测系统都采用socket方式来进行网络通信。
结合高速铁路道岔监测系统中的实时数据解析实例,在明确了解各种环境监测项的基础之上,制定socket报文协议,在qt(q toolkit)开发环境下,利用工厂模式来实现socket 报文的解析。
结论:此模式适合于高速铁路岔道系统中监测项已经明确的解析环境。
关键词:工厂模式;socket报文;qt解析
中国分类号:tp39 文献标识码:a
文章编号10053824(2013)01006803
0 引言
采用计算机网络进行远程数据通讯,具有通讯可靠和速度快的优点。
tcp/ip网络协议是目前广泛采用的一组完整的网络协议。
socket提供基于tcp/ip网络的应用编程接口,采用客户机和服务器通信机制,通过socket可以实现网络之间的连接与数据解析和交换。
高速铁路对实时安全性要求比较严格,所以在设计高速铁路道岔监测系统时,数据能否实时传输与正确解析就显得极其重要。
针对这种情况,提出利用socket报文来实现数据传输与正确解析。
同时,根据高速铁路道岔系统中监测项较多,且监测种类已经明确的情况,提出利用工厂模式来实现数据解析。
即:在工厂模式下,建立工厂类。
其优点是明确了各自的职责和权利,有利于整个软件
体系结构的优化[13]。
本文提出利用工厂模式来实现基于socket报文的数据解析与处理,从而更好地满足高速铁路道岔监测系统对于数据实时正确解析的要求。
1 socket报文
1.1 socket报文的数据格式
根据实际情况定义socket报文的数据格式如表1所示。
1.2 socket报文不同字段含义简介
1)长度l。
长度l为用户数据长度,由2字节组成,是控制域、地址域、应用功能码、业务数据的字节总数,为short int类型。
表1 socket报文的定义
长度(字节) socket数据定义
1 起始字符(68h)
2 长度l
1 起始字符(68h)
2 控制域c
8 地址域a
2 应用功能码afn
由业务类型确定业务数据
暂定为0 消息认证码pw
1 结束字符(16h)
2)控制域c。
控制域c表示报文传输方向和所提供的传输服务
类型的信息,由2个字节组成。
3)地址域。
地址域由8个字节组成,是设备的唯一标示。
4)应用功能码。
应用功能码afn由2个字节组成,为short int 类型。
5)业务数据。
业务数据是由数据单元构成的集合,业务数据可能包含n组数据单元。
数据单元由数据单元标识和数据体构成。
6)消息认证码。
消息认证码字段pw用于重要下行报文中,长度由认证算法决定,暂时为空。
pw是由主站按系统约定的认证算法产生,并在主站发送的报文中下发给终端,由终端进行校验认证,通过则响应主站命令,反之则否认,并且终端在收到带有pw的报文,必须在认证通过后,才能响应命令[4]。
2 基于socket报文格式的数据解析
2.1 工厂设计模式
工厂设计模式的思想是把创建对象的责任和使用对象的责任分开,工厂负责统一创建具体产品,然后再把这些产品转化为他们的抽象产品,返回给外部使用者,作为使用者关心的仅仅是抽象产品预留的接口,而不关心他们是怎么创建的。
这样核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节[56]。
2.2 利用qt实现数据解析
2.2.1 根据afn功能码创建多态类
高速铁路道岔实时环境监测系统主要接收并展示传感器传输的4个监测内容数据:设备维护状态数据、心跳信号数据、温湿度数据以及温湿度处理状态数据。
为了区分这4种数据,我们引入afn 功能码概念,利用afn功能码来区分是维护标示数据,还是心跳信号数据,还是温湿度数据,还是温湿度采集器状态数据,从而建立了一个抽象类(data process),以及4个子类心跳信号处理类(heart beat process)、维护状态处理类(manage status process)、温湿度数据处理类(weather data process)和温湿度状态处理类(weather status process)。
整体类图如1所示。
3)socket报文解析截图分析。
解析结果如图3所示:道岔平台id为101;车站id为10001;道岔编号为10001;监测项目id为5,代表温湿度数据监测;道岔周边温度为31.9 ℃,温度告警显示正常;湿度为49%rh,湿度告警显示正常。
该数据监测时间为20120707t16:56:12。
4 结语
本文结合高速铁路道岔监测系统中的实时数据解析实例,在明确了各种环境监测项的基础之上,制定socket报文协议,利用工厂模式来实现解析。
此种模式适合于高速铁路道岔系统中监测项等已经明确的实时解析环境中,但此种模式也存在一定的缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如
果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时,可能会出现要求工厂类根据不同条件创建不同实例的需求。
这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统维护和扩展非常不利。
根据工厂模式的缺点,下一步将会研究利用工厂方法模式来对此种模式的缺点来进行改进,以提高该解析方法效率。
参考文献:
[1] 谢希仁.计算机网络[m].北京:电子工业出版社,2008.
[2] xteam(中国)软件技术有限公司.qt程序设计[m].北京:清华大学出版社,2002.
[3] shalloway a, trott j r.设计模式精解[m].北京:清华大学出版社,2004.
[4] 多纳霍,卡尔福特. tcp/ip sockets编程[m].陈宗斌,译.北京:清华大学出版社,2009.
[5] 傅瑜光,陈刚.基于socket的报文通讯异步转换期的设计与实现[d].北京:清华大学软件学院,2004.
[6] 周坤,傅德胜.基于windows socket的网络数据传输与安全[d].南京:南京信息工程大学计算机与软件学院,2007.。