!大家来看看联通短信SGIP中的bind消息怎么写????(15分)

K

kmwap

Unregistered / Unconfirmed
GUEST, unregistred user!
从SP商到SMG网关的消息
消息 适用方式 描述
Bind SP为客户端 SP用该消息向SMG发出建立连接的请求
Bind_Resp SP为服务器 SP对Bind命令的应答
Unbind SP为客户端 SP用该消息向SMG通知将要断开现有的连接
Unbind_Resp SP为服务器 SP对Unbind命令的应答
Submit SP为客户端 SP用该消息向SMG请求发送短消息
Deliver_Resp SP为服务器端 SP用该消息对从SMG接收到的Deliver命令作出应答
Report_Resp SP为服务器 SP对从SMG接收到的Report命令作出应答
UserRpt_Resp SP为服务器 SP对从SMG接收到的UserRpt命令作出应答
Trace SP为客户端 SP用该消息向SMG请求跟踪某一条MT短消息的状态

SMG与SMG通信时,由客户端首先通过Bind命令向服务器端发起连接。服务器端根据Bind命令之中的登录名和密码,对客户端的合法性进行验证,然后返回一条Bind_Resp应答给客户端。如果验证通过,则客户端和服务器端的通信开始,否则中断连接

消息由消息头及消息体组成:

消息头的格式
字段 长度(字节) 类型 说明
Message Length 4 Integer 消息的总长度(字节)
Command ID 4 Integer 命令ID
Sequence Number 12 Integer 序列号

4.2.3消息体的格式
4.2.3.1Bind操作
Bind操作由Bind命令和Bind_Resp应答组成。客户端首先发送Bind命令,服务器端收到Bind命令后,对命令发送方进行验证,然后返回Bind_Resp应答。

4.2.3.1.1Bind命令的语法
字段 长度(字节) 类型 说明
Login Type 1 Integer 登录类型。 1:SP向SMG建立的连接,用于发送命令 2:SMG向SP建立的连接,用于发送命令 3:SMG之间建立的连接,用于转发命令 4:SMG向GNS建立的连接,用于路由表的检索和维护 5:GNS向SMG建立的连接,用于路由表的更新 6:主备GNS之间建立的连接,用于主备路由表的一致性 11:SP与SMG以及SMG之间建立的测试连接,用于跟踪测试 其它:保留
Login Name 16 Text 服务器端给客户端分配的登录名
Login Passowrd 16 Text 服务器端和Login Name对应的密码
Reserve 8 Text 保留,扩展用

4.2.3.1.2Bind_Resp应答的语法
字段 长度(字节) 类型 说明
Result 1 Integer Bind执行命令是否成功。 0:执行成功 其它:错误码
Reserve 8 Text 保留,扩展用

问题: 这要用winsock编程吗,发送消息时是用数据流还是消息报,怎么发送及接收???

 
//联通 sgip 协议登录实现 样例 仅供参考
//返回 0成功 登录 SMG
function SGIP_TEK_BindLogin( SMG_Socket: Integer; //socket 描述符
sp_code : longword;//企业代码30033
Login_type: byte;
Login_Name,Login_pw,Reserve : pchar ;
AreaCode : pchar
):integer;
const
Pk_head_len = 20;
var
szbuff : array [0..2048] of char ;
logstr,strdata : string;
iRet : Integer ;
//pakcet variant
packet : TSGIP_package ;
pk_Head : TSGIP_Pk_HEAD ;
pk_bind_resp: TSGIP_Pk_Bind_Resp ;
Pk_len : longword ;
stamptime : TTimeStamp ;
MSG_ID1,MSG_ID2 : longword ;
str : string ;
begin
{SGIP_BIND = $1 ;
SGIP_BIND_RESP = $80000001 ; }
//********************************************************************
//try
MSG_ID1 := DateTimeToSGIP_TimeStamp(now);
inc(SGIP_Sequence_Seed) ;
MSG_id2 := SGIP_Sequence_Seed ;

//Pk_head_len := sizeof(TSGIP_Pk_HEAD) ;
Pk_len := Pk_head_len + sizeof(TSGIP_Pk_Bind) ;
packet.head.Msg_Len := htonl(Pk_len) ;//
packet.head.CommandID := htonl(SGIP_BIND) ;
sp_code := Generate_SGIP_Sequ_1(areacode, pchar(InttoStr(sp_code)));
//南京 3025065200
//深圳 3075500000+ 30033
packet.head.SeqNum[1] := htonl(sp_code) ;
packet.head.SeqNum[2] := htonl(MSG_ID1);
packet.head.SeqNum[3] := htonl(MSG_id2);

packet.body.bind.login_type := Login_type ;//htonl(1);//htonl (2) ;
StrCopy(packet.body.bind.login_name,pchar(Login_Name));
StrCopy(packet.body.bind.login_pw,pchar(Login_pw));

iret := send(SMG_Socket,packet,Pk_len ,0);
if iret>0 then
begin
iret := recv(SMG_Socket,szbuff,Pk_head_len,0);
if iret>0 then
begin
CopyMemory(@pk_Head,@szbuff,Pk_head_len);
pk_Head.Msg_Len := ntohl(pk_Head.Msg_Len);
pk_Head.CommandID := ntohl(pk_Head.CommandID);
pk_Head.SeqNum[1] := ntohl(pk_Head.SeqNum[1]);
pk_Head.SeqNum[2] := ntohl(pk_Head.SeqNum[2]);
pk_Head.SeqNum[3] := ntohl(pk_Head.SeqNum[3]);
if pk_Head.CommandID = SGIP_BIND_RESP then
begin
iret := recv(SMG_Socket,szbuff,pk_Head.Msg_Len-Pk_head_len,0);
if iret>0 then
begin
//返回登录状态 如果返回0 表示成功
CopyMemory(@pk_bind_resp,@szbuff,pk_Head.Msg_Len-Pk_head_len);
result := pk_bind_resp.AResult ;
end
else //recv body fail
result := -4;
end
else // command id fail
result := -3;
end
else // recv fail
result := -2;
end
else //send fail
result := -1;
//except
// ;
//end;
end;
//本程序可以提供短信协议互转网关程序(For NT)
//(For UNIX/Linux 正在开发中 )/
//支持多用户接入及子号码分配
//可以控制每个用户发送量
//支持 SMPP/SGIP/CMPP 之间互转
//请邮件 netbabys@21cn.com
//or 020-83788645-2312
//QQ 2412932 加入时请注明 短信字样
 
先定义一个记录内型:
Bind=Record
LoginType:byte;
LoginName:array[0..15] of char;
LoginPassword:array[0..15] of char
Reserve:array[0..7] of char;
end;
 
顶部