下面为信息包的格式和内容
数据包格式如下图所示,所包含的内容从左到右进行传输:包头中的信息全部为网络字节顺序!
序号 |
字段名称 |
长度(Bytes) |
类型(C++) |
字段说明 |
1 |
head |
2 |
Unsigned Short |
包头标识,固定为0xFFFF |
2 |
version |
2 |
Unsigned Short |
版本信息,当前为0x0030 |
3 |
length |
2 |
Unsigned Short |
包括包头的全部包体长度 |
4 |
command |
2 |
Unsigned Short |
命令号 |
5 |
status |
4 |
Unsigned Integer |
应答状态 |
6 |
taskid |
4 |
Unsigned Integer |
任务流水号 |
7 |
sender |
4 |
Unsigned Integer |
发送方标识1 |
8 |
sessionid |
4 |
Unsigned Integer |
发送方标识2 |
9 |
timestamp |
4 |
Unsigned Integer |
时间戳 |
10 |
flag |
2 |
Unsigned Short |
数据加密标志:0:不加密,1:DES加密 |
11 |
reserved |
4 |
Unsigned Integer |
保留字段 |
包头信息中,开始标识(head),版本信息(version)为固定格式;
包体长度(length),提示整个包体(包括包头)的长度,接收方据此来完成一个业务数据包的接收和解析;
命令号(command),为客户端和服务器约定的业务命令,从0到65535,具体定义详见下表:
号码段 |
起始编号 |
结束编号 |
使用说明 |
1 |
0X0000 |
0X03E7 |
对应具体的业务命令号,如1为充值等 |
2 |
0X03E8 |
0XFFFF |
系统保留命令字,目前0XFFFE为心跳包,0XFFFF为心跳应答包 |
应答状态(status),请求时总设置为0;应答时,由SP应用服务程序返回相应的操作结果或错误原因;
任务流水号(taskid)由自行定义,SP应用程序在响应包中必须返回,SP应用程序可以将此作为数据包一段时间内的唯一序列号。
发送方标识1(sender)、发送方标识2(sessionid)、时间戳(timestamp)以及保留字段(reserved),可以为发送方保留一些私有信息,返回包时原样返回。
1、 通用网关在连接建立之后,根据刚才加密的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0038 2fd65329e2770074791503c2dab1d209fe0225636dd07f7277bd291209e1a498df28f7af2f0eb4f1be2831f0fa8987b7f9;其中业务加密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86系列的PC,需要做主机到网络(ntohs)字节顺序转换;
2、SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
3、 SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理
4、 SP应用服务程序在发送之前,同样根据密匙对该返回字符串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是返回加密字节流的长度,而且是网络字节的。
来自:http://blog.sina.com.cn/s/blog_62fd44430100v727.html
相关推荐
本篇文章将深入探讨如何使用C#的Socket类进行TCP数据的发送和接收,以及在上下位机通信中的应用。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保了数据的正确性和顺序。在...
1. **创建Socket对象**:`new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)`,定义为IPv4、流式套接字(适合TCP)和TCP协议。 2. **设置IP和端口**:`IPAddress.Parse("127.0.0.1")`...
在实际应用中,我们通常需要定义一个数据包的格式,比如包含头部信息(数据长度、序列号等),以便在接收端判断何时接收到一个完整的数据包。此外,为了防止死锁和提高程序健壮性,接收数据时可以设置超时机制,并...
在TCP/IP协议栈中,Socket接口定义了应用程序如何通过IP协议与网络上的其他系统进行通信。 在Java中,我们可以使用`java.net.Socket`和`java.net.ServerSocket`类来创建和管理Socket。客户端使用`Socket`类创建连接...
- 在工业应用中,FINS UDP协议可能用于快速发送少量数据,例如状态查询或简单的控制命令,因为它没有TCP的连接建立和维护过程,可以快速发送和接收数据。 4. **SocketTool**: - SocketTool通常是一个辅助工具,...
本篇文章将详细探讨Android环境下如何进行Socket Client端和Socket Server端的数据发送与接收。 1. **Socket基础知识** - **Socket定义**:Socket是网络编程中的一个接口,它允许应用程序通过TCP/IP协议进行数据...
SocketTcp_TcpSocket服务端框架是一个专为开发者设计的简单且通用性强的TCP服务器实现。这个框架旨在简化网络编程过程,让开发者能够快速构建自己的TCP服务应用,只需要对原有代码进行少量修改,即可轻松地将其集成...
- 发送心跳包:在一个循环中,定期调用`Send()`方法发送心跳包数据,数据可以是简单的字符串或自定义的协议格式。 - 接收响应:同时,通过`Receive()`方法监听服务器的响应,如果在一定时间内未收到响应,可以认为...
通过创建Socket实例,绑定到特定的IP地址和端口,然后调用Receive或Send方法,我们可以接收和发送网络数据。对于抓包,我们需要监听所有的网络流量,而不是只关注特定的连接,因此,通常会使用套接字选项SOCK_RAW来...
2. **Session**: 表示一个客户端连接,包含了与客户端通信的所有信息,如Socket对象、客户端IP地址等,以及接收和发送数据的方法。 3. **Protocol**: 协议处理组件,负责解析接收到的数据并封装待发送的数据,可以...
1. 设计消息结构:定义消息的格式,如固定长度、包头+包体或特殊分隔符。 2. 创建数据序列化/反序列化函数:将业务数据转换成字节流,反之亦然。 3. 编写发送函数:使用NetworkStream.Write()将数据写入网络流。 4. ...
一旦有连接请求,SocketTool将显示连接信息,并允许你接收和发送TCP数据。 2. **创建TCP客户端**:输入目标服务器的IP地址和端口号,SocketTool可以主动发起连接,用于测试服务器的响应。同样,你可以在此模式下...
总之,理解并妥善处理TCP粘包、多包、少包和断包是网络编程中的关键。通过合理的设计和利用TCP协议提供的机制,可以有效地解决这些问题,保证数据的正确传输。在实际开发中,我们需要根据具体的应用场景和需求选择...
- 为了区分心跳包和其他业务数据,可以在心跳包的格式上做文章,例如在包头或包尾添加特定的标识符。 - 使用JSON或XML等结构化格式封装心跳包,包含版本号、发送时间、类型(心跳)等信息,提高可读性和扩展性。 ...
4. **发送请求并接收响应**:通过Socket发送Modbus请求,然后接收并解析服务器返回的响应,确认数据是否正确。 5. **异常处理和重试机制**:在调试过程中,可能会遇到超时、连接断开等问题,需要设计合理的异常处理...
本文主要探讨Socket编程中用于发送和接收消息的关键函数——send和recv。 send函数是用来向TCP连接的另一端发送数据的。它的函数原型为: ```cpp int send(SOCKET s, const char FAR *buf, int len, int flags); ``...
在Socket编程中,开发者需要定义服务器端(Server Socket)和客户端(Client Socket),并为每种协议创建相应的Socket实例。对于TCP,服务器端会监听特定端口,等待客户端发起连接请求;客户端则向服务器发起连接...
- **发送(Send)/接收(Receive)**:一旦连接建立,双方都可以通过`send()`和`recv()`函数进行数据的发送和接收。TCP保证了数据的可靠传输,即使在网络不稳定的情况下也能确保数据的正确性。 5. **关闭连接**:...
本篇文章将深入探讨如何在Delphi 2010中利用Socket发送结构体协议。 首先,理解Socket通信的基础是非常重要的。Socket是TCP/IP协议族的一部分,它为进程间的通信提供了一种标准接口。在Delphi中,我们可以使用 Indy...
在Java中,Socket类位于`java.net`包下,提供了TCP/IP协议的网络通信功能。 接下来,我们讨论定时器(Timer)的使用。`java.util.Timer`类和`java.util.TimerTask`类是Java中用于定时任务的核心组件。Timer可以安排...