使用厂商提供的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 2SGIPAPI_API int SGIP_Get_MO(int conn_id,void **pp_MO);

解决方案 »

  1.   

    unit Sms;interfaceuses
      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.
      

  2.   

    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;
      

  3.   

    难道说在这里没有人用过这个?在csdn上居然没人能解决这个问题?
      

  4.   

    楼主怎么能这样说话呢?怪不得没有人来回这贴子.
    楼上不是有朋友在帮你解答吗?
    你贴出来那段所谓厂商提供的C++源码完全是玩具代码,是不能来拿来照着翻译的.
    它无非就是创建SOCKET,然后侦听,接收数据.
    你最好就用个SOCKET控件就是了.比如TIndyTcpServer,
    SGIP的包格式也不是什么秘密,自己解析吧,那么简单.
      

  5.   

    印象中,在这里有很多的高人,所以才觉得在这里不存在什么问题的。楼上朋友的解答肯定是看了的,但是他用的d6,我用的是d7,里面没有那两个控件TClientSocket。我不知道该怎么使用啊。
      

  6.   

    please see help file carefully. 
    doubt you are a programmer.
      

  7.   

    小弟初学delphi,水平很菜,对于网络编程更是一窍不通。