基于联通SGIP协议的短信接收问题?

leiqp 2004-09-23 05:34:02
使用厂商提供的api进行短信接收,厂商提供的是C++源码(该源码运行正常),现在需要转换成Delphi源码,请问该如何转换?100分双手奉上。
C++源码如下:
void CTestDlg::OnButton2()
{
// TODO: Add your control notification handler code here
int res ;
void *p_MO=NULL;
int listenfd,connfd;
struct sockaddr_in servaddr;
char buf[1024];

struct MO_msg *p_msg=NULL;
struct MO_report *p_report=NULL;

listenfd=socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0){
sprintf(buf,"socket create error,%s",strerror(errno));
MessageBox(buf,"error",MB_OK);
return;
}


memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(54338);

if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr_in))<0)
{
sprintf(buf,"socket bind error,%s",strerror(errno));

MessageBox(buf,"error",MB_OK);
return;
}
if(listen(listenfd,5)<0)
{
sprintf(buf,"socket listen error,%s",strerror(errno));
MessageBox(buf,"error",MB_OK);
return;
}

connfd=accept(listenfd,NULL,NULL);


if(connfd<0)
{
sprintf(buf,"socket accept error,%s",strerror(errno));
MessageBox(buf,"error",MB_OK);
return;
}


while(1)
{
res=SGIP_Get_MO(connfd,&p_MO);

if(res==ERROR_SOCKET_CLOSE)
{
sprintf(buf,"connection clsed by gateway\n");
MessageBox(buf,"error",MB_OK);

break;
}
if(res<0){
sprintf(buf,"get mo error = %d\n",res);
MessageBox(buf,"error",MB_OK);
break;
}
else if(res==MO_MSG)
{
//printf("get mo msg:");
p_msg=(struct MO_msg *)(p_MO);

p_msg->msg[p_msg->msgLen]=0;
sprintf(buf,"spnum:%s sourceUser:%s,msgFormat:%d msgLen:%lu\n",
p_msg->SPNumber,p_msg->sourceUser,p_msg->msgFormat,p_msg->msgLen);
MessageBox(buf,"MO MSG",MB_OK);

sprintf(buf,"msg=%s\n",p_msg->msg);
MessageBox(buf,"MO MSG",MB_OK);

}
else if(res==MO_REPORT)
{
//printf("get mo report: ");
p_report=(struct MO_report *)(p_MO);

sprintf(buf,"mobile:%s \n",p_report->mobile);
MessageBox(buf,"MO REPORT",MB_OK);
sprintf(buf,"seq:%lu %lu %lu state:%d errcode:%d\n",
p_report->seq1,p_report->seq2,p_report->seq3,p_report->state,p_report->errCode);
MessageBox(buf,"MO REPORT",MB_OK);

}
//break;
}
closesocket(connfd);

closesocket(listenfd);


}

其中使用到的头文件包括如下信息:
struct MO_msg{
char sourceUser[21]; //发送消息的手机
char SPNumber[21]; //SP接入号
unsigned char tp_pid;
unsigned char tp_udhi;
unsigned char msgFormat; //消息格式
unsigned long msgLen; //消息长度
char msg[160]; //消息内容
};

struct MO_report{
unsigned long seq1; //相应的submit序列号1-3
unsigned long seq2;
unsigned long seq3;
unsigned char report_type;
char mobile[21]; //目的手机号
unsigned char state; //状态 0:发送成功 1:等待发送 2:发送失败
unsigned char errCode; //错误代码
};


#define MO_MSG 1
#define MO_REPORT 2

SGIPAPI_API int SGIP_Get_MO(int conn_id,void **pp_MO);
...全文
535 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
realljx 2004-09-28
  • 打赏
  • 举报
回复
帮助别人最需要的是耐心的,不然搂主怎么会把分给你呢?呵呵.
halfdream 2004-09-27
  • 打赏
  • 举报
回复
楼主怎么能这样说话呢?怪不得没有人来回这贴子.
楼上不是有朋友在帮你解答吗?


你贴出来那段所谓厂商提供的C++源码完全是玩具代码,是不能来拿来照着翻译的.
它无非就是创建SOCKET,然后侦听,接收数据.
你最好就用个SOCKET控件就是了.比如TIndyTcpServer,
SGIP的包格式也不是什么秘密,自己解析吧,那么简单.
leiqp 2004-09-27
  • 打赏
  • 举报
回复
难道说在这里没有人用过这个?在csdn上居然没人能解决这个问题?
leiqp 2004-09-27
  • 打赏
  • 举报
回复
小弟初学delphi,水平很菜,对于网络编程更是一窍不通。
tigerii 2004-09-27
  • 打赏
  • 举报
回复
please see help file carefully.
doubt you are a programmer.
leiqp 2004-09-27
  • 打赏
  • 举报
回复
印象中,在这里有很多的高人,所以才觉得在这里不存在什么问题的。楼上朋友的解答肯定是看了的,但是他用的d6,我用的是d7,里面没有那两个控件TClientSocket。我不知道该怎么使用啊。

Bellamy 2004-09-23
  • 打赏
  • 举报
回复
只看过SMPP
Elysium 2004-09-23
  • 打赏
  • 举报
回复
http://www.spzone.net/bbs/topic.asp?topic_id=1129&forum_id=7

将源码中声明的 recorde 类型改为packed record
procedure TForm1.Button3Click(Sender: TObject);
var
FV_Date1_S,FV_Date2_S:string;
str_i,SendSize:integer;
stream1:TWinSocketStream;
abc,bc:longword;
begin
stream1:=TWinSocketStream.Create(ClientSocket1.Socket,30000);
memo1.Lines.Add('-------------------向服务端发送BIND请求--------------------');
if not ClientSocket1.Active then
begin
memo1.Lines.Add('客户端没有打开');
exit;
end;
DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
DateTimeToString(FV_Date2_S,'zzz',now);
FillChar(sBind,sizeof(sBind),0);
FillChar(sHead,sizeof(sHead),0);
str_i:=sizeof(sHead)+sizeof(sBind);
sBind.LonginType:=1;
strpcopy(sBind.LonginPass,FV_LoginPass);
strpcopy(sBind.LonginName,FV_LoginName);
abc:=htonl(FV_SNumber);
sHead.MessageLength:=htonl(str_i);
sHead.CommandId:=htonl(SGIP_Bind);
sHead.SNumber1:=abc;
sHead.SNumber2:=htonl(StrToInt(FV_Date1_S));
sHead.SNumber3:=htonl(StrToInt(FV_Date2_S));
stream1.WriteBuffer(sHead,sizeof(sHead));
stream1.WriteBuffer(sBind,sizeof(sBind));
memo1.Lines.Add('sHead.MessageLength '+inttostr(ntohl(sHead.MessageLength)));
memo1.Lines.Add('sHead.CommandId '+inttostr(ntohl(sHead.CommandId)));
bc:=ntohl(abc);
memo1.Lines.Add('sHead.SNumber1 '+inttostr(bc));
memo1.Lines.Add('sHead.SNumber2 '+inttostr(ntohl(sHead.SNumber2)));
memo1.Lines.Add('sHead.SNumber3 '+inttostr(ntohl(sHead.SNumber3)));
memo1.Lines.Add('sBind.LonginType '+inttostr(sBind.LonginType));
memo1.Lines.Add('sBind.LonginName '+sBind.LonginName);
memo1.Lines.Add('sBind.LonginPass '+sBind.LonginPass);
memo1.Lines.Add('------------------Bind请求已发送----------------------');
if stream1.WaitForData(5000) then
begin
fillchar(cHead,sizeof(cHead),0);
fillchar(cbind_resp,sizeof(cBind_Resp),0);
stream1.ReadBuffer(cHead,sizeof(cHead));
stream1.ReadBuffer(cBind_resp,sizeof(cBind_resp));
end;
memo1.Lines.Add('cHead.MessageLength '+inttostr(ntohl(cHead.MessageLength)));
bc:=ntohl(cHead.CommandId);
memo1.Lines.Add('cHead.CommandId '+inttostr(bc));
bc:=ntohl(cHead.SNumber1);
memo1.Lines.Add('cHead.SNumber1 '+inttostr(bc));
memo1.Lines.Add('cHead.SNumber2 '+inttostr(ntohl(cHead.SNumber2)));
memo1.Lines.Add('cHead.SNumber3 '+inttostr(ntohl(cHead.SNumber3)));
memo1.Lines.Add('cBind.LonginType '+inttostr(cBind_resp.Result));
stream1.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
//type
{abc=packed record
head:SGIPHead;
submit:xSubmit;
end;}
var
FV_Date1_S,FV_Date2_S:string;
i,SendSize:integer;
//xxx:abc;
stream2:twinsocketstream;
abc,bc:longword;
line1,line2:longword;
begin
stream2:=twinsocketstream.Create(clientsocket1.Socket,5000);
SendSize:=0;
memo1.Lines.Add('-------------------------submit--------------------------');
if not ClientSocket1.Active then
begin
memo1.Lines.Add('-------------------客户端没有打开,submit失败-------------');
exit;
end;
DateTimeToString(FV_Date1_S,'mmddhhnnss',now);
DateTimeToString(FV_Date2_S,'zzz',now);
FillChar(sSubmit,sizeof(sSubmit),0);
FillChar(sHead,sizeof(sHead),0);
with ssubmit do
begin
strpcopy(SPNumber,'4488');//;
ChargeNumber :='8613188890924';
UserCount :=1; //1-100
{for i:=1 to UserCount do
begin
//strpcopy(UserNumber[i-1].TelN,'8613065073355');//+T_Tel);// :array of TelCount; //长度为UserCount
UserNumber[i-1].TelN:='8613011725853';
end;}
UserNumber:='8613188890924';
CorpID:='41027';//CorpID:='4488';//strpcopy(CorpID,FV_corpID);
ServiceType:='4488';//FV_SPNumber);//'4488';
FeeType :=1;
FeeValue :='0';
GivenValue :='0';
AgentFlag :=0;
MOrelatetoMTFlag :=2;
Priority :=0;
ExpireTime :='';
ScheduleTime :='';
ReportFlag :=1;
TP_pid :=0;
tp_udhi :=0;
MessageCoding :=15;
MessageType :=0;
MessageLength :=htonl(161);
strpcopy(MessageContent,T_msg); //长度为 MessageLength;
//Reserve :='';
end;
{line1:=sizeof(sHead);
line2:=sizeof(sSubmit);}
with sHead do
begin
abc:=htonl(FV_SNumber);
MessageLength:=htonl(sizeof(sHead)+sizeof(sSubmit)-3); //改为packed record 以后,此处不用 -3
CommandId:=htonl(SGIP_Submit);
SNumber1:=abc;
SNumber2:=htonl(StrToInt(FV_Date1_S));
SNumber3:=htonl(StrToInt(FV_Date2_S));
end;
leiqp 2004-09-23
  • 打赏
  • 举报
回复
unit Sms;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, DB, DBTables, IdTCPServer,sockets,winsock;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
GroupBox3: TGroupBox;
Label6: TLabel;
EditMobileNumber: TEdit;
Label7: TLabel;
MemoSendComment: TMemo;
IdTCPClient1: TIdTCPClient;
Label1: TLabel;
Button3: TButton;
IdTCPServer1: TIdTCPServer;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const
MO_MSG_OK = 1;
MO_REPORT = 2;
ERROR_SOCKET_CLOSE = -110;

type
MO_msg = record
sourceUser :array[1..20] of char;
SPNumber :array[1..20] of char;
tp_pid :PChar;
tp_udhi :PChar;
msgFormat :PChar;
msgLen :Longint;
msg :array[1..159] of char;
end;
p_msg = ^MO_msg;

var
Form1: TForm1;

implementation

{$R *.dfm}

function SGIP_Get_MO(i:integer;pp_Mo:pointer):integer;stdcall;
external 'sgipapi.dll';

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
listenfd,connfd,res : integer;
servaddr : sockaddr_in;
p_MO : pointer;
Mo : MO_msg;
begin
p_MO := nil;
// p_msg := nil;
listenfd :=socket(AF_INET,SOCK_STREAM,0);
if listenfd < 0 then
begin
showmessage('socket error');
exit;
end;

servaddr.sin_family :=AF_INET;
servaddr.sin_addr.S_addr := htonl(INADDR_ANY);
servaddr.sin_port := htons(54338);


if bind(listenfd,servaddr,Sizeof(sockaddr_in))<0 then
begin
showmessage('bind error');
exit;
end;

if listen(listenfd,5)<0 then
begin
showmessage('listen error');
exit;
end;

connfd := accept(listenfd,nil,nil);

while (1>0) do
begin

res := SGIP_Get_MO(connfd,@p_MO);////////////在这里返回的结果是socketread错误的值。
showmessage('res结果是'+inttostr(res));
if res=MO_MSG_OK then
begin
//4 对收到的MO,应用程序要根据SGIP_Get_MO返回的类型,
//将*pp_MO转换为struct MO_msg *或struct MO_report *

Mo := p_msg(p_MO)^;
showmessage('消息是:'+Mo.sourceUser);
end;

end;



end;

end.
《中国联通SGIP1.2短消息网关开发接口库》 1.接口说明 该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。 2.功能特点 1)严格按照SGIP1.2协议实现,支持Bind, BindResp,Submit, SubmitResp, Deliver, DeliverResp, Report, ReportResp, Unbind, UnbindResp消息。 2)采用多线程并发处理的方式获取强大的性能,针对SGIP协议的特点,内建线程池进行消息的收发及处理操作,充分发挥系统和网络性能,再大的业务量也能够得到及时处理,丢包率小于0.01/%。 3)发送消息采用短连接的方式;接收消息采用半长连接的方式,可以设置超时时间,在没有消息的情况下,主动断开网关连接。 4)接口库经过高度封装,模块化强,使用简单,屏蔽了网关通信,消息收发和处理的复杂性操作,SP用户只需要关注具体的业务处理过程,大大简化了短消息开发的难度! 5)利用内建的线程池,可以大幅度提高SP短消息处理的速度。 3.接口使用 该接口库以动态库的形式提供,包含以下三个文件:sgip.h, sgip.lib, SGIP.DLL.在动态库中导出了CSgip类,只需要调用三个函数就可以完成短消息收发的全部工作(Start,Submit,Release)。 《中国联通SGIP1.2模拟网关》 功能介绍: 1.运用线程池原理,支持大量并发连接,命令处理速度快。 2.可以主动批量下发Deliver消息,可以自定义Deliver消息的任何字段内容,以及MO消息发送的循环次数,相邻两条消息的间隔时间。 3.具有日志记录功能。 4.自定义功能强,可以自定义日志记录方式,以及屏幕输出方式。 5.目前,只支持sgip专用方式,不支持http方式。 作者:PrinceToad Email:princetoad@tom.com 类型:有偿提供源码! 平台:Windows98/NT/2K/XP/2003. 接口库下载地址:http://gmm.nease.net/SGIP.rar SGIPAPI接口使用说明:http://gmm.nease.net/SGIPAPI.htm SGIP模拟网关使用说明:http://gmm.nease.net/SGIPGW.htm (模拟网关包含在开发包内) 免费使用,无任何限制,注册用户提供源码一份! 注册地址:http://www.softreg.com.cn/shareware.asp?id=11517 或联系作者:PrinceToad@tom.com

1,593

社区成员

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

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