Delphi实现NetBIOS广播收发(2)
2008-04-09 04:18:31来源:互联网 阅读 ()
end;
ncbY.ncb_rto:=0;
ncbY.ncb_sto:=0;
ncbY.ncb_lana_num:=0;
ncbY.ncb_cmd_cplt:=0;
for x:=1 to 10 do
ncbY.ncb_reserve[x]:=0;
ncbY.ncb_event:=0;
end;
file://后处理例程的作用是当接收到广播消息时,立即向相应窗口发送消息。我在这里偷了点懒,以广播方式发送一个定时器消息。如果你愿意可以向指定窗口发送自定义消息,这样要复杂一些。
首先,要把指定窗口的句柄传递给后台处理例程。通常这是做不到的,但可以利用一些技巧做到。在NCB记录后面紧挨着声明一个句柄类型,然后把指定窗口的句柄赋值给它的实例变量;这样句柄变量的地址与NCB是连续的。在后处理中通过指针或汇编语句将ncbR的地址移到最后一个字节+1,就是窗口句柄的起始地址。明白吗?至于自定义消息,需要重新编译连接库,限于篇幅我就不罗嗦了,有兴趣的可以自己尝试。
procedure postrout(var ncbR:PNCB);
begin
sendMessage(wnd_BROADCAST,WM_TIMER,0,0);
end;
end.
////////窗口单元//////////
unit broadcast;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,netbios;
type
Tmain=class(TForm)
private
{Private declarations}
file://消息处理过程,注意消息宏要与后处理中的一致。
procedure post_main(var Message:TMessage);message WM_TIMER;
public
{Public declarations}
end;
var
main: Tmain;
ncbname:UCHAR;
ncbRock:PNCB;
post_add:POST;
implementation
{$R *.DFM}{$A-}{$I-}
/////////主窗口建立过程/////////
procedure Tmain.FormCreate(Sender: TObject);
var
ret:UCHAR;
i,x,y:integer;
p:single;
begin
new(ncbRock);
randomize();i:=0;
FillChar(char_buffer,sizeof(char_buffer),0);
post_add:=@postrout;
file://取后处理例程的地址。
ncbRock.ncb_buffer:=@char_buffer; file://取数据缓冲区的地址。
InitNCB(ncbRock);
ret:=9;
ncbname:=random(100);
ncbRock.ncb_name[1]:=ncbname;
ncbRock.ncb_command:=$30;
file://加名,ret为0加名成功。
while ((i<10)and(ret<>0)) do
begin
ret:=netbiosSR(ncbRock);
i:=i+1;
end;
if ret<>0 then
begin
for i:=1 to 20 do
messagebeep(-1);
MessageDlg(‘网络通信无法实现!您需要关闭程序重新运行.'',mtWarning,
[mbOk],0);
end
else if ret=0 then
begin
ncbRock.ncb_post:=post_add;
ncbRock.ncb_command:=$a3; file://异步接收方式字。
ncbRock.ncb_event:=0;
ncbRock.ncb_length:=512;
ret:=netbiosSR(ncbRock);
end;
end;
///////////广播消息处理过程/////
procedure Tmain.post_main(var Message:TMessage);
var
x:integer;
ret:UCHAR;
begin
file://取出数据缓冲区的内容
for x:=0 to 511 do
int_buffer[x+1]:=char_buffer[x];
////以下可以进行数据处理////
file://重新打开异步接受。
ncbRock.ncb_post:=post_add;
ncbRock.ncb_command:=$a3;
ncbRock.ncb_event:=0;
ncbRock.ncb_length:=512;
ret:=netbiosSR(ncbRock);
end;
end.
注:广播发送非常简单,不再详述。上述程序经过一年运行完全可靠。另外,经过改造可以将其改为LAN下的聊天程序。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
