以下是短信的接收代码,程序已测可以接收到短信。
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记录集,但还是不行,请高手不吝赐教,多谢!