2024年4月19日发(作者:)
delphisocket发送和接受tcp信息包
展开全文
最近有个项目用到delphi 以前学过 但是网络通讯这块不懂 以前
是直接接受字符串现在改用传递信息包 希望大侠帮忙写下接受和发送
特定信息包的代码
下面为信息包的格式和内容
数据包格式如下图所示,所包含的内容从左到右进行传输:包头
中的信息全部为网络字节顺序!
包头信息中,开始标识(head),版本信息(version)为固定
格式;
包体长度(length),提示整个包体(包括包头)的长度,接收
方据此来完成一个业务数据包的接收和解析;
命令号(command),为客户端和服务器约定的业务命令,从0
到65535,具体定义详见下表:
号码段 起始编号 结束编号 使用说明
1
2
0X0000
0X03E8
0X03E7 对应具体的业务命令号,如1为充值等
0XFFFF
系统保留命令字,目前0XFFFE为心跳
包,0XFFFF为心跳应答包
应答状态(status),请求时总设置为0;应答时,由SP应用服
务程序返回相应的操作结果或错误原因;
任务流水号(taskid)由自行定义,SP应用程序在响应包中必须
返回,SP应用程序可以将此作为数据包一段时间内的唯一序列号。
发送方标识1(sender)、发送方标识2(sessionid)、时间戳
(timestamp)以及保留字段(reserved),可以为发送方保留一些私有信
息,返回包时原样返回。
包头信息中,除了包体长度(length)以外,其他的字段,包括
开始标识(head),版本信息(version),任务流水号(taskid),
发送方标识1(sender),发送方标识2(sessionid),时间戳
(timestamp),以及数据加密标识(flag),需要在响应包中原样返回;
流程
1、 通用网关在连接建立之后,根据刚才加密的字节
流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送
的字节数为加密后的字节流字节数+24(24信息包头的字节长度);
在上述的例子中,信息包大约如ffff0200 00001100 00004e5f
00114b3f 00000000 0100 0038
2fd65329e277c2dab1d209fe0225636dd07f7277bd2
91209e1a498df28f7af2f0eb4f1be2831f0fa8987b7f9;其中业务加
密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86
系列的PC,需要做主机到网络(ntohs)字节顺序转换;
2、 SP应用服务程序接收(Recv)该信息包,根据包
头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字
符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
3、 SP应用服务程序根据流程开发人员与之协商好的格式
对接收的字符串进行解析,然后进行响应的处理
4、 SP应用服务程序在发送之前,同样根据密匙对该返回字符
串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过
来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字
节流的长度是返回加密字节流的长度,而且是网络字节的
以下是自己接受字符串的时的代码
procedure SocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
lmsg:String;
vflag,i,j:Integer;
发布评论