SMPP开发短信SP遇到的问题? ( 积分: 100 )

  • 主题发起人 主题发起人 yetsen
  • 开始时间 开始时间
Y

yetsen

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己写了一个smpp协议的短信收发程序,现在遇到点问题,请大家帮助:
按照协议定义了一个SMPP消息:
TSMPP_HEAD_tag = packed record //消息头
Total_Length: LongWord; //消息总长度(含消息头及消息体)
Command_ID: LongWord; //这个字段表明此条短消息的类型
Command_status: LongWord;//此字段表示一个命令的成功与失败,
Sequence_ID: LongWord; //消息号
end;
TBIND_tag = packed record //消息体, 假设
system_id: array[0..15] of Char;
TBIND = Packed Record //消息结构
Head : TSMPP_HEAD_tag;
body : TBIND_tag;
当具体发送这个消息的时候,由于system_id是可变长度的,假设system_id=('a','a','a',#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0)
在Total_Length的取值为SizeOf(TBIND)=32将不对,因该是sizeof( TSMPP_HEAD_tag)=16,再加上length(system_id)=4,取20才对,发送给server端,cSocket.SendBuf( TBIND1, SizeOf(TBIND1))时,如何截断包尾部的一串空值???
我暂时将变长改成定长实现了,但是程序缺少通用性。
 
可能是我的问题表达不够清楚,我已经将问题解决了。参考了论坛上一位前辈的帖子,
消息头定义不变,所有消息体用如下定义代替,封装时,先给TSMPP_Body变量赋值,类似于堆栈操作,然后将data部分赋值给 TSMPP_MSG 变量的body,并将消息头的长度用TSMPP_Body变量的len部分计算得出。可以试用于所有消息。CMPP的程序就不能这样,因为消息的各个部分是定长,即使没有值也要空着,这样类定义好了,长度也就定了。虽然操作简单,但是每个消息都要定义类。
TSMPP_MSG = Packed Record
Head : TSMPP_HEAD_tag;
body : array [0..254] of char;
end;
TSMPP_Body=Packed Record
len:byte;
data:array [0..254] of char;
end;
procedure Pushdata(str:String);
var
i: integer;
begin
for i:=1 to length(str) do
with smpp_body do
begin
data[len]:=str;
inc(len);
end;
if length(str)>1 then inc(smpp_body.len);
end;
 
领下分,呵呵
 
[:)]好吧。
 
后退
顶部