Indy tcp 接受最后一个包的问题。 (自己解决了,剩下的25分 给提供文件读写方法的同志) (30分)

  • 主题发起人 主题发起人 tt8
  • 开始时间 开始时间
T

tt8

Unregistered / Unconfirmed
GUEST, unregistred user!
Indy tcp 接收某银行数据

//文件数据发送请求包结构
FILE_REQ_BANK_STRUCT = record
dgtype: char; //'3'
dglength: array[1..5] of char; //所有域的总长度
sndstat: char; //'0'=last packed '1'=goto '2'=failure
databuf: array[1..BUFFER_SIZE] of char; //source
end;
-----------------------
...
repeat
...
client.ReadBuffer(file_req, sizeof(file_req));
...
client.WriteBuffer(file_resp, sizeof(file_resp), true);
...
until condition

开始接收,应答都很正常,但是最后一个包 接收时发生错误。
经排查,估计是该包内容长度和sizeof(file_req)不等的原因(请参看 问题2068301),
导致写入到 file_req 发生错误。

我该如何 解决该问题??? thanks.

(注:file_req 为我的一个包接收结构)


(请参看 问题2068301:如下:
FNAME_REQ_BANK_STRUCT = record
dgtype: char; //'1'
dglength: array[1..5] of char; //所有域的总长度 '00086'
sfile: array[1..80] of char; //要传送的文件名
end;
-----------------以上为定义
var
fname_req:FNAME_REQ_BANK_STRUCT;

...

fname_req.dgtype:='1';
//如果下句错,为什么这句没有错?
fname_req.dglength:='00086';

//这句提示错误:incompatible types 'Array' and 'String'
fname_req.sfile:='asdf';

为什么?




来自:finalrinoa, 时间:2003-7-29 15:26:00, ID:2068357
把dglength的类型改为String不就行了


来自:tt8, 时间:2003-7-29 15:28:00, ID:2068363 | 编辑
要和unix下c 通讯,只能用 array [1..80] of char 形式


来自:lichdr, 时间:2003-7-29 15:32:00, ID:2068376
兩者要一樣長。
你先判斷一下賦值字符串的長度,不夠長的話後面用空格補


来自:tt8, 时间:2003-7-29 15:35:00, ID:2068392 | 编辑
lichdr的方法好象可以
不过,那不是很累?
请给出具体方法。谢谢




来自:tt8, 时间:2003-7-29 15:37:00, ID:2068407 | 编辑
另外如果我收到返回包,

那么他会不会正确填好 某个 含 array[]of char 的struct?


来自:zxp_ping, 时间:2003-7-29 15:37:00, ID:2068408
strpcopy(fname_req.dglength:='000086');




来自:tt8, 时间:2003-7-29 15:38:00, ID:2068412 | 编辑
strpcopy(fname_req.sfile,'asdf');
没用的,我试过。


来自:lichdr, 时间:2003-7-29 15:58:00, ID:2068466
用format怎樣
a := 'asdf';
fname_req.sfile:=format('%80s',[a]);


来自:tt8, 时间:2003-7-29 16:09:00, ID:2068506 | 编辑
没有用

各位高手能不能 把上面的程序段拷到 实际程序中编译一下 谢谢。


来自:tt8, 时间:2003-7-29 16:11:00, ID:2068510 | 编辑
看起来很简单的问题,却折磨着我2个小时了!!!

帮帮我,谢谢。

最好是在实际程序中编译一下。


来自:pihome, 时间:2003-7-29 16:21:00, ID:2068551
strcopy(@fname_req.sfile,'asdf');



来自:tt8, 时间:2003-7-29 16:24:00, ID:2068566 | 编辑
通过,谢谢


 
FILE_REQ_BANK_STRUCT = record
dgtype: char; //'3'
dglength: array[1..5] of char; //所有域的总长度
sndstat: char; //'0'=last packed '1'=goto '2'=failure
databuf: array[1..BUFFER_SIZE] of char; //source
end;
这个结构是为了和他们在unix c下面的结构相匹配,无法改用string.
typedef struct
{
char dgtype; // '3'
char dglength[5];
char sndstat; // '0'=last packed '1'=goto '2'=failure
char databuf[1024]; // source
} FILE_REQ_BANK_STRUCT;

高手请指点。谢谢
 
fname_req.dglength:='00086';
肯定不成,一个是字符数组一个是字符串,必须一个一个赋值
fname_req.dglength[0] :='0';
fname_req.dglength[1] :='0';
fname_req.dglength[2] :='0';
fname_req.dglength[3] :='8';
fname_req.dglength[4] :='6';
或者把00086放到字符串变量中,循环赋值fname_req.dglength:=tmps[i+1];
使用i+1是因为字符串中字符从1开始。

 
fname_req.dglength:='00086';
/长度一样是可以的,
如果fname_req.dglength:='86',就提示错误,这个问题我在2068301已经得到答案。

另外,本问题已经解决。
刚才问了银行,他们的包长度是不一样的,
根据长度接收就可以了:
先接收包头
新定义一个 部分包如下
FILE_REQ_BANK_STRUCT_PART = record
dgtype: char; //'3'
dglength: array[1..5] of char; //所有域的总长度
sndstat: char; //'0'=last packed '1'=goto '2'=failure
end;。
然后根据 strtoint(dglength)-7>0 来接收剩下的内容就好了
if strtoint(dglength)-7>0 then
begin
接收strtoint(dglength)-7字节。
end;
可见,银行是很注意节省空间的。

以上问题准备分5分给cnsandboy,因为这个问题是我自己解决。

剩下的25分
请继续参与,提出读写文件的方法,以供参考,谢谢。
(充分发挥这25分的价值,不好意思)
因为包接收好后,要写到文件里面。
 
接受答案了.
 
后退
顶部