用API函数实现简单的网络发送和接收

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs,winsock, StdCtrls, ExtCtrls, DB, ADODB;

type
   TForm1 = class(TForm)
     edtHostIP: TEdit;
     edtHostPort: TEdit;
     btnSend: TButton;
     lstTags: TListBox;
     Timer1: TTimer;
     lblMsg: TLabel;
     conn: TADOConnection;
     cmd: TADOCommand;
     lstSTag: TListBox;
     lstTagValue: TListBox;
     lstRecv: TListBox;
     procedure FormCreate(Sender: TObject);

     procedure ConnectHost;
     procedure GetData(myStr:string);

     procedure msg(myStr:string);
     procedure FormDestroy(Sender: TObject);
     procedure btnSendClick(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
     procedure SaveToDB;
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;

   skt:TSOCKET;
   addr:TSockAddr;

implementation

{$R *.dfm}

procedure TForm1.ConnectHost;
var
   re:integer;
begin
   skt:=socket(AF_INET,SOCK_STREAM,0);
   if skt=INVALID_SOCKET then
     begin
       msg('create socket failed!');
       exit;
     end
   else
     msg('create socket ok');

   ZeroMemory(@addr,sizeof(addr));
   addr.sin_family:=AF_INET;
   addr.sin_addr.S_addr:=inet_addr(pchar(edtHostIP.text));
   addr.sin_port:=htons(strtoint(edtHostPort.Text));
   re:=connect(skt,addr,sizeof(addr));
   if re<>0 then
     begin
       msg('connect host '+edtHostIp.Text+' failed!');
       exit;
     end
   else
     msg('connect host '+edtHostIp.Text+' ok');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
   WSAData:TWSAData;
begin
   lstTags.Items.LoadFromFile('lics.txt');

   if (WSAStartup(makeword(1,0),WSAData)<>0) then
     begin
       msg('Initialize WinSock failed!');
       exit;
     end
   else
     msg('Initialize winsock   ok');
end;

procedure TForm1.msg(myStr: string);
begin
   lblmsg.Caption:=myStr;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
   WSACleanUp;
end;

procedure TForm1.GetData(myStr: string);
var
   BufSend,BufRecv:pchar;
   re:integer;
begin
   getMem(BufSend,1024);
   ZeroMemory(BufSend,1024);
   myStr:=myStr+#10;
   StrPCopy(BufSend,myStr);
   re:=send(skt,BufSend^,length(BufSend),0);
   if re=SOCKET_ERROR then
     msg('send error');

   GetMem(BufRecv,1024);
   ZeroMemory(BufRecv,1024);
   recv(skt,BufRecv^,1024,0);

   lstTagValue.Items.Add(trim(copy(strpas(BufRecv),14,length(strpas(BufRecv)))));
   lstRecv.Items.Add(strpas(BufRecv));

   FreeMem(BufSend);
   FreeMem(BufREcv);
end;

procedure TForm1.btnSendClick(Sender: TObject);
var
   i,iPos:integer;
   s:string;
   s1,s2,s3:string;
begin
   msg('receive remote data ......');
   connectHost;
   lstRecv.Clear;
   lstSTag.Clear;
   lstTagValue.Clear;
   for i:=0 to lstTags.Count-1 do
     begin
       application.ProcessMessages;
       s:=lstTags.Items[i];         // crac_bat11.cpv
       s1:=copy(s,6,length(s)-4);   // bat11.cpv
       iPos:=pos('.',s);
       s2:='G01 FG 01 '+s1;         //   G01 FG 01 BAT11.CPV
       s3:=copy(s,1,iPos-1);        // CRAC_BAT11
       lstSTag.Items.Add(s3);
       try
         GetData(s2);
       except
         msg('error reading remote date... you should retry!');
       end;
     end;
   msg('End at :'+datetimetostr(now()));
   closesocket(skt);
   SaveToDB;
   msg('Save to infoplus end now :'+datetimetostr(now()));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   btnSendClick(sender);
end;

//±£´æÊý¾Ýµ½Êý¾Ý¿âÖÐ
procedure TForm1.SaveToDB;
var
   i:integer;
   sTag,SVal,sSQL:string;
begin
   try
     conn.Open();
     msg('connect database server OK');
   except
     msg('connect database server failed');
     exit;
   end;

//   lstSQL.Clear;
   for i:=0 to lstSTag.Count-1 do
     begin
       sTag:=lstSTag.Items[i];
       sVal:=lstTagValue.Items[i];
       if (sVal<>'62') AND (sVal<>'61') then
         begin
           sSQL:='update ip_analogdef set ip_input_value='+sVal+' where name=''+sTag+'';
           //sSQL:='update ip_analogdef set ip_input_value='+sVal+' where name=''+sTag+'';
           try
           cmd.CommandText:=sSQL;
           cmd.Execute;
           except
           msg('error:update failed!');
           conn.Close;
           end;
         end;
//       lstSQL.Items.Add(sSQL);
     end;
   conn.Close;
end;

end. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值