捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
用API函数实现简单的网络发送和接收
关键字:API WinSocket 网络发送接收 TWSAData
来 自:原创
平 台:Win9x,Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2005/10/24
发布者:dutboy 发布时间:2005/10/24
编辑器:DELPHI7 语  种:简体中文
分 类:互联网 下载浏览:0/13325
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
实际工作中的代码,向服务器发送特定格式命令后,取得想要的工艺位号数据。
直接复制过来的,有兴趣的自己看吧。

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.
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论7条 当前显示最后6条评论
riverqh 2005/10/29 13:56:11
阻塞式的,假如传输过程不小心断了,界面会怎样呢?不如开个线程。。。还有不每次发生通讯都是要建立socket的,这样的效率不得不考虑啊。。。
dutboy 2005/10/29 17:22:16
从使用效果来看,非常稳定,
jack_801 2006/3/6 10:27:23
学习
nicai 2006/3/31 17:22:46
谢谢,我正好用到.
j02504 2006/7/5 14:54:09
ok
net_kdh 2008/5/13 22:46:27
谢谢,学习
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表