用API函数实现简单的网络发送和接收
来源:互联网 发布:德国人长相知乎 编辑:程序博客网 时间:2024/06/12 01:18
unit Unit1;interfaceuses 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.