寻求帮助,socket包头包体定义和发送

xj_delphi 2007-05-24 05:19:15
最近作银行接口,用delphi的socket,因初学delphi,请教
A.银行到供电请求(YH-GD11)
字段名 数据类型 字段含义 备注
数据包包头
PACKAGE_LENGTH Char(10) 包长度 不含此字段本身的长度10byte
TRAN_CODE Char(2) 交易码 值为----"11"
BANK_NO Char(3) 银行代号
RECORD_NUM Char(5) 记录条数 没有记录则为’0 ’
FILENAME Char(32) 文件名 没有文件则为32个" "
包体
BANK_SUB Char(10) 银行网点代号
OPER_ID Char(5) 操作员代码
FLOW_NO Char(16) 银行流水号
USER_NO Char(10) 户号
WORK_DATE Char(8) 营业日期 格式为yyyymmdd,双方记账日期
REMARK Char(60) 备注字段 保留
B.供电返回银行应答(GD-YH11)
字段名 数据类型 字段含义 备注
数据包包头
PACKAGE_LENGTH Char(10) 包长度 不含此字段本身的长度10byte
RE_CODE Char(2) 返回码
REMSG_LENGTH Char(5) 返回信息长度
RETURN_MSG 根据上一字段的值 返回信息
TRAN_CODE Char(2) 交易码 值为----"11"
BANK_NO Char(3) 银行代号
RECORD_NUM Char(5) 记录条数 没有记录则为’0 ’
FILENAME Char(32) 文件名 没有文件则为32个" "
包体
第一行结构
FLOW_NO Char(16) 银行流水号
WORK_DATE Char(8) 营业日期 格式为yyyymmdd
BUSINESS_CODE Char(2) 分局代码 营业区域代码
USER_NO Char(10) 户号
USER_NAME Char(64) 户名
USER_ADDR Char(64) 地址
TOTAL_MONEY Char(12) 电费及违约金合计金额
第二行结构:(如有N笔电费,则有N行)
MON Char(6) 电费月份 格式为yyyymm
MON_SN Char(2) 电费次数
GROUP_NO Char(5) 计量点号
MON_MONEY Char(12) 应交电费
MON_PUNISH Char(12) 违约金
TOTAL_POWER Char(8) 计费电量
WRITE_DATE Char(8) 抄表日期 格式为yyyymmdd
REMARK Char(60) 备注 注解退价差等特殊处理事项,在收据上必须体现

如何定义这两个socket包以及发送和接收,最好有源码。
...全文
1777 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjf0334 2007-07-24
  • 打赏
  • 举报
回复
用TStringList打包
fox1999 2007-07-19
  • 打赏
  • 举报
回复
太簡單了
ERR0RC0DE 2007-07-14
  • 打赏
  • 举报
回复
我帮你写,给RMB,呵呵
fox1999 2007-07-14
  • 打赏
  • 举报
回复
你做的系統在哪裡用?

我不敢用你的系統了
etomahawk 2007-05-28
  • 打赏
  • 举报
回复
定义结构体嘛!然后发送的时候将数据复制到Buffer,然后直接发送就可以,到接受端,再将数据还原。比如:
TPackCommand = (cmdLogin, cmdData, cmdLoginOff, cmdResp, cmdUnknow);

TPackHead = packed record
CMD : TPackCommand;
end;

TData = packed record
FLOW_NOChar : Array [0..15] of Char;
WORK_DATEChar : Array [0..7 ] of Char;
BUSINESS_CODEChar : Array [..1] of Char;
USER_NOChar : Array [0..9] of Char;
USER_NAMEChar : Array [0..63] of Char;
USER_ADDRChar : Array [0..63] of Char;
TOTAL_MONEYChar : Array[0..11] of Char;
Remark : Array [0.200] of Char; //这里可以写一写备注信息
end;

TDataPack = packed record
PackHead : TPackHead;
Data : TData;
end;

var
DataPack : TDataPack;
发送的时候,先填充这个包的内容:
DataPack.PackHead.CMD := cmdData;
......
发送时:
Move ( Buffer, DataPack, SizeOf ( DataPack ) );
...
Send ( S, ..Buffer, ...);
接受到后:
PackHead : TPackHead;
....
Move ( Buffer, PackHead, SizeOf ( PackHead ) );
Case PackHead.CMD of
cmdData:
Move ( Buffer, DataPack, SizeOf ( DataPack ));
FlowNoChar := DataPack.Data.FLOW_NOChar;
....

异常情况未处理,只写了一个思路。自己慢慢研究吧!
hawk_e2e 2007-05-27
  • 打赏
  • 举报
回复
包可以这样定义:
包的长度(字节数):dword -- 包头
包的数据。其长度等于:包长度 - SizeOf(dword)。 -- 包数据

这是最简单的,也就是说包头是固定长度的,读取数据时可以先读取包头;然后根据包头信息读取后面的包数据。

SEE!

ScriptBaby 2007-05-26
  • 打赏
  • 举报
回复
自己定义一个分隔符号, 或者采用一种编码方式来区分"头"和"体"
发送的时候直接发, 接收的时候找到分隔符号进行切分, 然后根据定义的标识符号确定这部分的功能
xj_delphi 2007-05-24
  • 打赏
  • 举报
回复
补充,用TCP.
ScriptBaby 2007-05-24
  • 打赏
  • 举报
回复
首先你要确定打算用UDP还是打算用TCP, 如果是UDP的话直接发就可以了, 如果是TCP的话, 注意包之间的分隔符号

Socket本身并不具备识别你所认为的"头"和"体"的能力, 所以这些要靠你自己实现
yao518 2007-05-24
  • 打赏
  • 举报
回复
定义成记录类型试试看吧,这方面我也是刚接触.看看对你有没有帮助

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧