delphi socket发送和接受tcp信息包 tcp socket
下面为信息包的格式和内容
数据包格式如下图所示,所包含的内容从左到右进行传输:包头中的信息全部为网络字节顺序!
包头信息中,开始标识(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),可以为发送方保留一些私有信息,返回包时原样返回。
包头信息中,除了包体长度(length)以外,其他的字段,包括开始标识(head),版本信息(version),任务流水号(taskid),发送方标识1(sender),发送方标识2(sessionid),时间戳(timestamp),以及数据加密标识(flag),需要在响应包中原样返回;
流程
1、 通用网关在连接建立之后,根据刚才加密的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0038 2fd65329e2770074791503c2dab1d209fe0225636dd07f7277bd291209e1a498df28f7af2f0eb4f1be2831f0fa8987b7f9;其中业务加密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86系列的PC,需要做主机到网络(ntohs)字节顺序转换;
2、 SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
3、 SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理
4、 SP应用服务程序在发送之前,同样根据密匙对该返回字符串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是返回加密字节流的长度,而且是网络字节的
以下是自己接受字符串的时的代码
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
lmsg:String;
vflag,i,j:Integer;
larriveDate:TarriveDate;
ip:String;
islimit:Boolean;
resData:String;//返回数据
buff:array[0..255]of byte;
begin
ip:=Socket.RemoteAddress;
islimit:=True;
For j:=0 to ips.Count-1 Do
Begin
if (ip=ips[j]) then
begin
islimit:=False;
end;
End;
if not islimit then
Begin
CoInitialize(nil);
Socket.ReceiveBuf(buff,4);//应该就在这里修改吧
lmsg:=Socket.ReceiveText;
SendTo();
Memo1.Lines.Add(DateTimeTostr(now)+'来自主机'+ip+'的请求数据:'+lmsg );
saveToLog(DateTimeTostr(now)+'来自主机 '+ip+ ' 的请求数据:'+ lmsg);
if lmsg<>'' then
Begin
try
saveToLog(DateTimeTostr(now)+'开始处理接受数据'+lmsg);
larriveDate:=analyecmdData(lmsg);
vflag:=exChange(larriveDate);
Memo1.Lines.Add('*'+Socket.ReceiveText+'*'+lmsg);
Memo1.Lines.Add(DateTimeTostr(now)+'数据处理完毕:处理结果:'+inttostr(vflag));
saveToLog(DateTimeTostr(now)+'数据处理完毕:处理结果:'+inttostr(vflag));
except
begin
vflag:=1;
Memo1.Lines.Add(DateTimeTostr(now)+'数据处理异常:'+inttostr(vflag));
saveToLog(DateTimeTostr(now)+'数据处理异常:'+inttostr(vflag));
end;
//vflag:=1;
end;
for i:=0 to sessions do
begin //取得匹配的客户端
if session[i].CHandle = Socket.SocketHandle then
begin
case vflag of
0: resData:=inttostr(vflag)+'$'+larriveDate.userID+'$'+larriveDate.TelNo+'$'+inttostr(larriveDate.inPutKey);
1: resData:='1'+'$'+'系统繁忙请稍后冲值';
2: resData:='2'+'$'+'平台用户ID不存在';
end;
session[i].CSocket.SendText(resData);
Memo1.Lines.Add(DatetimeTostr(now)+'向客户端发送处理完毕命令'+resData);
saveToLog(DatetimeTostr(now)+'向客户端发送处理完毕命令'+resData);
end;
end;
end;
CoUninitialize;
end
else
Begin
CoInitialize(nil);
CoUninitialize;
// saveToLog(DatetimeTostr(now)+'非法访问Ip'+ip+'访问被阻止');
End;
end;
序号
字段名称
长度(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
保留字段
更多阅读
怎样通过电子邮件发送传真 发送电子邮件广告
怎样通过电子邮件发送传真——简介我们大多数在办公室工作的人对传真机至少都有一些基本了解。其概念很简单--传真机扫描文档,将信息编码,再通过电话线路传送出去。线路另一端的传真机对信号解码并打印出原文档的摹本。通过电子邮件发
关于企业对外捐赠和接受捐赠有关会计处理和税务处理 接受捐赠的税务处理
关于企业对外捐赠和接受捐赠有关会计处理和税务处理 一、企业接受捐赠资产的会计处理㈠、原制度、准则下的会计处理原《企业会计制度》规定外商投资企业接受捐赠,接受现金捐赠,直接计入“资本公积—接受现金捐赠”科目;接受非现金捐赠
关于百度地图离线地图和离线导航包的研究 高德地图如何离线导航
这两天研究了下百度地图,心的如下1该软件的地图和导航图是分开的,其中导航图只有道路和路口,道路两旁只有极少数的地标2该软件的地图是可以离线下载的,无论哪个版本的百度地图3导航图也可以下载,但是要注意的是,对于3.0版的该软件,可以下载
全国大部分地区的移动和联通短信息中心号码 在我国大部分地区 水
短信息中心号码组成使用规律的,通常是以“+”开头,后面中国地区的代码如:86,接着是运营商号段,如联通130、移动138 等,紧接着是运营商代码,如移动为0、联通为1,在接着是以省份、直辖市、市、区级单位来命名:如武汉0270、深圳0755,注意直辖市尾
跳蚤臭虫咬了奇痒又肿怎么办 跳蚤和臭虫咬的包
家里曾经遭过一次很严重的跳蚤灾。刚开始是家里的崽崽腿上、身上起着一个个惨不忍睹的又红又肿的大包,直嚷着痒啊痒,可怜啊。带去医院去看皮肤科,医生很肯定地说,肯定是有虫咬的,注意一下家里有什么虫之类的。开始不相信,家里有什么虫啊,以