delphi中udp数据接收端实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int erfac e
us es
Wi ndows, Mes sages, Sys Utils, Var iants, Cla sses, Grap hics, Cont rols, Form s, Di alogs, Std Ctrls,Wins ock;
type
TFor m1 =class(TFor m)
But ton2: TBut ton; //开始接收数据
List Box1: TLis tBox; //将接收到的数据显示到列表中
Edit1: TE dit; //显示接收了多少次数据
p roced ure B utton2Clic k(Sen der:TObje ct);
priva te
{ P rivat e dec larat ions}
pub lic
{Publi c dec larat ions}
end;
pr ocedu re Ch eckRc(szEr r : P Char);
va r
For m1: T Form1;
con st
DEFAU LT_PO RT =5150;//接收端口号
DEF AULT_COUNT = 20; //接收20次
D EFAUL T_BUF FER_L ENGTH = 4096; //接收数据的最大缓冲区大小
v ar
nPort : In teger = DE FAULT_PORT;
dwC ount: DWO RD =DEFAU LT_CO UNT;
dwLen gth : DWOR D = D EFAUL T_BUF FER_L ENGTH ;
sz Inter face: arr ay[0..31]of ch ar;
wsd : WSAD ata;//保存初始化信息
soRec v : T SOCKE T; //接收数据的socke t
psz Recv: PCha r; //接收数据的缓冲区指针
nR et :integ er;
i : in teger;
dwS ender Size: Int eger;
siSe nder,local : SO CKADD R_IN;
nErr or :Integ er;
imple menta tion
pro cedur e Che ckRc(szErr : PC har);
begi n
Mes sageB ox(0,szErr,'Err or',M B_OK);
end;
pr ocedu re TF orm1.Butto n2Cli ck(Se nder: TObj ect);
var
i:integ er;
n LastE rror: Int eger;
nNum OfRec v : I ntege r;
be gin
nNum OfRec v :=0;
//初始化so cket
nEr ror := WSA Start up(Ma keWor d(2,2),wsd);
if Bool ean(n Error) the n
Mes sageB ox(0,'WSAS tartu p','E rror',MB_O K);
//建立so cket
soRec v :=socke t(AF_INET,SOCK_DGRAM,0);
if so Recv= SOC KET_E RRORthen
begin
Chec kRc('socke t');
end;
//设置端口与地址
lo cal.s in_fa mily:= AF_INET;
loc al.si n_por t :=htons(5150);
lo cal.s in_ad dr.S_addr:= in et_ad dr('127.0.0.1');
//将soc ket绑定地址
nE rror:= bi nd(so Recv,local,size of(lo cal));
ifnErro r = S OCKET_ERRO R the n
Che ckRc('bind');
//分配内存
pszR ecv := All ocMem(4096);
f or i:= 0to dw Count -1 d o
beg in
dw Sende rSize := S izeOf(siSe nder);
//接收发送过来的数据,并保存到缓冲区中
nRet := r ecvFr om(so Recv,pszRe cv[0],4096,0,si Sende r,dwS ender Size); ifnRet= SOC KET_E RRORthen
b egin
Chec kRc('recvF rom');
br eak;
e nd el se if nRet = 0then
else
begin
psz Recv[nRet] := #0;
//添加到列表中,仅用于显示
self.ListB ox1.I tems.Add(p szRec v);
en d;
Inc(nNum OfRec v);
se lf.Ed it1.T ext := Int ToStr(nNum OfRec v);
end;//end of f or
//关闭 so cket
close socke t(soR ecv);
//释放分配的内存
Free Mem(p szRec v);
//清理wi nsock et
WS AClea nup();
end;
en d.
。