您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

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

时间:2011/9/3 15:14:43 点击:

  核心提示:实际工作中的代码,向服务器发送特定格式命令后,取得想要的工艺位号数据。直接复制过来的,有兴趣的自己看吧。unitUnit1;interfaceusesWindows,Messages,SysUtils...
实际工作中的代码,向服务器发送特定格式命令后,取得想要的工艺位号数据。
直接复制过来的,有兴趣的自己看吧。

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.

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号