以下是短信的接收代码,程序已测可以接收到短信。
const
MO_MSG_OK = 1;
MO_REPORT_OK = 2;
ERROR_SOCKET_CLOSE = -110;type
p_msg = ^MO_msg;
MO_msg = packed record
sourceUser :array[0..20] of char;
SPNumber :array[0..20] of char;
tp_pid :Byte;
tp_udhi :Byte;
msgFormat :Byte;
msgLen :Cardinal;
msg :array[0..159] of char;
end;
type
p_report = ^MO_report;
MO_report = packed record
seq1 :Cardinal;
seq2 :Cardinal;
seq3 :Cardinal;
report_type :Byte;
mobile :array[0..20] of char;
state :Byte;
errCode :Byte;
end;procedure TfrmReceiveSms.ReceiveSmsClick(Sender: TObject);
var
str:string;
listenfd,connfd,res,i : integer;
servaddr : sockaddr_in;p_MO : ^p_msg;
Mo : MO_msg;
report : MO_report;label ReTry;
begin
str :='';
listenfd :=socket(AF_INET,SOCK_STREAM,0);
if listenfd < 0 then
begin
showmessage('socket error');
exit;
end; FillChar(servaddr,Sizeof(sockaddr_in),#0);
servaddr.sin_family :=AF_INET;
servaddr.sin_addr.S_addr := htonl(INADDR_ANY);
servaddr.sin_port := htons(54123); 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; ReTry : //goto标签
connfd := accept(listenfd,nil,nil);
if connfd<0 then
begin
showmessage('socket accept error');
exit;
end;
while (1>0) do
begin
//初始化两个结构体
p_MO := nil;
FillChar(Mo,sizeof(MO_msg),#0);
FillChar(report,sizeof(MO_report),#0); res := SGIP_Get_MO(connfd,@p_MO);
if res<0 then
begin
goto ReTry;
end;
if res=MO_MSG_OK then
begin
//对收到的MO,应用程序要根据SGIP_Get_MO返回的类型,
//将*pp_MO转换为struct MO_msg *或struct MO_report *
Mo := p_msg(p_MO)^;
// showmessage('短消息的内容是:'+Mo.msg);
//存入数据库
with Query1 do
begin
close;
sql.Clear;
sql.Add('insert into ReceiveSms values("'+Mo.sourceUser+'","'+Trim(Mo.msg)+'",getdate())');
execsql;
end; end; if res=MO_REPORT_OK then
begin
report := p_report(p_MO)^;
// showmessage('发送成功的手机号码是:'+report.mobile);
//存入数据库
if report.state = 0 then
str := '发送成功!!!';
if report.state = 1 then
str := '等待发送!!!';
if report.state = 2 then
str := '发送失败!!!';
with Query1 do
begin
close;
sql.Clear;
sql.Add('insert into ReceiveReport values("'+report.mobile+'","'+str+'",getdate())');
execsql;
end;
end; end;end;现在虽然可以接收到消息了,但是存在问题,就是我用手机回复一条短信假设长度为20个字符,当我再回复一条短信时(假设长度为10)结果我收到的Mo的信息就是第2条短信加上第一条中的后面10个字符,若第2条长度大于20则可以收到正确信息。我已经用fillchar初始化了Mo记录集,但还是不行,请高手不吝赐教,多谢!
const
MO_MSG_OK = 1;
MO_REPORT_OK = 2;
ERROR_SOCKET_CLOSE = -110;type
p_msg = ^MO_msg;
MO_msg = packed record
sourceUser :array[0..20] of char;
SPNumber :array[0..20] of char;
tp_pid :Byte;
tp_udhi :Byte;
msgFormat :Byte;
msgLen :Cardinal;
msg :array[0..159] of char;
end;
type
p_report = ^MO_report;
MO_report = packed record
seq1 :Cardinal;
seq2 :Cardinal;
seq3 :Cardinal;
report_type :Byte;
mobile :array[0..20] of char;
state :Byte;
errCode :Byte;
end;procedure TfrmReceiveSms.ReceiveSmsClick(Sender: TObject);
var
str:string;
listenfd,connfd,res,i : integer;
servaddr : sockaddr_in;p_MO : ^p_msg;
Mo : MO_msg;
report : MO_report;label ReTry;
begin
str :='';
listenfd :=socket(AF_INET,SOCK_STREAM,0);
if listenfd < 0 then
begin
showmessage('socket error');
exit;
end; FillChar(servaddr,Sizeof(sockaddr_in),#0);
servaddr.sin_family :=AF_INET;
servaddr.sin_addr.S_addr := htonl(INADDR_ANY);
servaddr.sin_port := htons(54123); 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; ReTry : //goto标签
connfd := accept(listenfd,nil,nil);
if connfd<0 then
begin
showmessage('socket accept error');
exit;
end;
while (1>0) do
begin
//初始化两个结构体
p_MO := nil;
FillChar(Mo,sizeof(MO_msg),#0);
FillChar(report,sizeof(MO_report),#0); res := SGIP_Get_MO(connfd,@p_MO);
if res<0 then
begin
goto ReTry;
end;
if res=MO_MSG_OK then
begin
//对收到的MO,应用程序要根据SGIP_Get_MO返回的类型,
//将*pp_MO转换为struct MO_msg *或struct MO_report *
Mo := p_msg(p_MO)^;
// showmessage('短消息的内容是:'+Mo.msg);
//存入数据库
with Query1 do
begin
close;
sql.Clear;
sql.Add('insert into ReceiveSms values("'+Mo.sourceUser+'","'+Trim(Mo.msg)+'",getdate())');
execsql;
end; end; if res=MO_REPORT_OK then
begin
report := p_report(p_MO)^;
// showmessage('发送成功的手机号码是:'+report.mobile);
//存入数据库
if report.state = 0 then
str := '发送成功!!!';
if report.state = 1 then
str := '等待发送!!!';
if report.state = 2 then
str := '发送失败!!!';
with Query1 do
begin
close;
sql.Clear;
sql.Add('insert into ReceiveReport values("'+report.mobile+'","'+str+'",getdate())');
execsql;
end;
end; end;end;现在虽然可以接收到消息了,但是存在问题,就是我用手机回复一条短信假设长度为20个字符,当我再回复一条短信时(假设长度为10)结果我收到的Mo的信息就是第2条短信加上第一条中的后面10个字符,若第2条长度大于20则可以收到正确信息。我已经用fillchar初始化了Mo记录集,但还是不行,请高手不吝赐教,多谢!
解决方案 »
- delphi7 结构体数组 解析。。
- 请问安装程序用的是一个窗体么
- 在ADODATASET控件的AfterInsert事件中赋值怎么会出错???急。。。。。
- 高手请进:关于Delphi调用Word的意外问题,请高手指点,谢谢!
- 用StringGrid显示查询结果,然后通过选择StringGrid的cells,显示相应的图片
- 关于MDI的问题
- 有没有办法在报表(FastReport)中动态载入jpg照片?(在线)
- 我写了一个delphi 程序能运行一点对应窗口就出现错误 在线等.....................................
- To Kingron:针对刚才的问题?
- 公布EXE文件加密期源代码
- 怎样能编写程序让它播放一连串的音频?
- 如何实现??把点一个按钮,打开EMAIL,并且把系统剪贴板里面的内容粘贴到EMAIL里面,同时填写好收件人(有默认的值)
begin
//对收到的MO,应用程序要根据SGIP_Get_MO返回的类型,
//将*pp_MO转换为struct MO_msg *或struct MO_report *
Mo := p_msg(p_MO)^;跟踪测试到 Mo := p_msg(p_MO)^; 时,在执行这句之前Mo都为空值,但是执行后就发现消息多了一些字符.一个朋友说可能是端口的数据没有清空,请高手解答.如果分不够再加.