在delphi下收发数据包的程序范例,内容大多出自同一篇不能实用的文章,不知有哪位大哥有相关资料或者实例。要能完成网络适配器枚举,加名,侦听,接受,发送等基本功能,不胜感激.(也可发EMAIL:[email protected])
部分源码:
function NETBIOS_ADDName(lana:integer;name:string;num:integer):integer;
var
i,x:integer;
s:string;
AddNameNcb,addnncb:pncb;
delay:integer;
begin
new(AddNameNcb);
//AddNameNcb.ncb_name:='XL_Video_000010';
AddNameNcb.ncb_post:=nil;
AddNameNcb.ncb_lana_num:=lana;
for x:=0 to length(name) do begin//name='XL_Video_000010'
AddNameNcb.ncb_name[x]:=byte(name[x]);
end;
AddNameNcb.ncb_command:=NCBADDNAME or ASYNCH;//
Netbios(addr(AddNameNcb));
delay:=0;
Repeat
sleep(20);
inc(delay);
until
(AddNameNcb.ncb_cmd_cplt<>NRC_PENDING)or(delay>=300);
if AddNameNcb.ncb_cmd_cplt=$0d then begin
AddNameNcb.ncb_lana_num:=lana;
for x:=0 to length(name) do begin
AddNameNcb.ncb_name[x]:=byte(name[x]);
end;
//AddNameNcb.ncb_name:='XL_Video_000010 ';
AddNameNcb.ncb_post:=nil;
AddNameNcb.ncb_command:=NCBDELNAME or ASYNCH ;
Netbios(addr(AddNameNcb));
delay:=0;
Repeat
sleep(20);
inc(delay);
until
(AddNameNcb.ncb_cmd_cplt<>NRC_PENDING) or (delay>=300);
end
else if AddNameNcb.ncb_retcode=NRC_GOODRET then begin
showmessage('加名成功:'+' '+inttostr(AddNameNcb.ncb_cmd_cplt)); end
else begin
showmessage('加名失败:'+' '+inttostr(AddNameNcb.ncb_cmd_cplt));
result:=AddNameNcb.ncb_retcode; end;
end;
function NETBIOS_LanaEnum(g_lenum:PLanaEnum):integer;
var
i,j:integer;
s:string;
encb:pncb;
begin
//dispose(encb);
new(encb);
encb.ncb_buffer:=addr(g_lenum);//问题是否在此处?help me!
encb.ncb_length:=sizeof(TADAPTERSTATUS)+16*sizeof(TNAMEBUFFER);//sizeof(g_lenum)
encb.ncb_command:=NCBENUM;
Netbios(addr(encb));
if encb.ncb_cmd_cplt<>NRC_GOODRET then begin//在此处返回5:命令超时
showmessage('netbios:enum_error');
result:=encb.ncb_retcode;
exit;
end;
result:=NRC_GOODRET;
end;
部分源码:
function NETBIOS_ADDName(lana:integer;name:string;num:integer):integer;
var
i,x:integer;
s:string;
AddNameNcb,addnncb:pncb;
delay:integer;
begin
new(AddNameNcb);
//AddNameNcb.ncb_name:='XL_Video_000010';
AddNameNcb.ncb_post:=nil;
AddNameNcb.ncb_lana_num:=lana;
for x:=0 to length(name) do begin//name='XL_Video_000010'
AddNameNcb.ncb_name[x]:=byte(name[x]);
end;
AddNameNcb.ncb_command:=NCBADDNAME or ASYNCH;//
Netbios(addr(AddNameNcb));
delay:=0;
Repeat
sleep(20);
inc(delay);
until
(AddNameNcb.ncb_cmd_cplt<>NRC_PENDING)or(delay>=300);
if AddNameNcb.ncb_cmd_cplt=$0d then begin
AddNameNcb.ncb_lana_num:=lana;
for x:=0 to length(name) do begin
AddNameNcb.ncb_name[x]:=byte(name[x]);
end;
//AddNameNcb.ncb_name:='XL_Video_000010 ';
AddNameNcb.ncb_post:=nil;
AddNameNcb.ncb_command:=NCBDELNAME or ASYNCH ;
Netbios(addr(AddNameNcb));
delay:=0;
Repeat
sleep(20);
inc(delay);
until
(AddNameNcb.ncb_cmd_cplt<>NRC_PENDING) or (delay>=300);
end
else if AddNameNcb.ncb_retcode=NRC_GOODRET then begin
showmessage('加名成功:'+' '+inttostr(AddNameNcb.ncb_cmd_cplt)); end
else begin
showmessage('加名失败:'+' '+inttostr(AddNameNcb.ncb_cmd_cplt));
result:=AddNameNcb.ncb_retcode; end;
end;
function NETBIOS_LanaEnum(g_lenum:PLanaEnum):integer;
var
i,j:integer;
s:string;
encb:pncb;
begin
//dispose(encb);
new(encb);
encb.ncb_buffer:=addr(g_lenum);//问题是否在此处?help me!
encb.ncb_length:=sizeof(TADAPTERSTATUS)+16*sizeof(TNAMEBUFFER);//sizeof(g_lenum)
encb.ncb_command:=NCBENUM;
Netbios(addr(encb));
if encb.ncb_cmd_cplt<>NRC_GOODRET then begin//在此处返回5:命令超时
showmessage('netbios:enum_error');
result:=encb.ncb_retcode;
exit;
end;
result:=NRC_GOODRET;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货