一个网络广播的问题(类式超级解霸网络播放的功能)--分数不封顶(100分)

  • 主题发起人 主题发起人 chonsee
  • 开始时间 开始时间
C

chonsee

Unregistered / Unconfirmed
GUEST, unregistred user!
本人想做一个能象超级解霸那样能够广播播放的播放器.比如我们宿舍有几台电脑.
只要有一台机子播放其它的都能接收.我想提出两个问题
第一 采出什么样的方式进行数据传输能使接收方播放更为流畅.
第二 怎样实现广播?(怎样广播,怎样接收)
希大虾踊跃灌水.(先拿出100分,如能获得答案再送100分)
 
这个好办,只要编写一个驻留内存的木马程序.在主机中按每个机器的IP地址发送数据包即可!
 
广播地址为255, 如: 192.168.4.255(mask 255.255.255.0), 即向所有的192.168.4.1-254
发送数据.用Realplayer server效果好象好些, 以前有人讨论过, 查找一下
 
使用广播地址(如果确信大家都要看),否则使用组播地址,要看的人加入此组。
如果你不愿意写程序可以研究RealServer如何实时采集发送,否则自己写程序
传送数据一般用UDP协议,如果需要效果比较好可以使用RTP/rtcp协议。叙述起来就很复杂了
 
关键的部分不在于网络协议,而在于数据接收后怎么解码!!!!!!!!
 
to xie he:
能否告诉我哪里曾经讨论过?
希大家继续各抒己见
 
按关键词 '广播' 检索到问题数:27条,共2页。当前是第 1 页。... ...
 
肯定要有压缩算法,否则网络太忙了
 
这里有一个UDP广播的例子(copy的:-p):
////////////////////////////////////////////////////////////////////////////
Delphi实现NetBIOS广播收发


  NetBIOS网络协议对于很多读者来说可能比较陌生,但其实它是
由IBM开发的一
个很古老的协议,当年在LAN上也风光一时。说它老,其实也不过10
年光景,IT业的
发展实在是太快。由于NetBIOS不具备路由功能,也就是说它的数据
包无法跨网段传
输,因此在广域网、城域网大行其道的今天,它已退居配角。如果
你有心的话,能
够发现在Window95/98的网络协议中仍然保留着NetBIOS,不过它已
经改名叫NetBEUI
(NetBIOS扩展用户接口),是NetBIOS的Microsoft改进版。另外在
TCP/IP以及IPX/SPX
协议中,也依然保留了对NetBIOS的支持,只要查看网络
协议属性中的高级,就能看到启用NetBIOS的选项。
  之所以这样是有原因的。NetBIOS协议短小精悍,非常适用于小
型局域网,特别
是一些对实时性要求较高的网络环境。NetBIOS的广播功能由于有开
发使用方便、系
统开销小的优点,所以在很多场合仍然被大量使用。笔者由于工作
需要,在一个航天
测控软件的编制中就使用了NetBIOS
广播功能。
  我原以为这是件很简单的工作,因为WIN32API中提供了一个
Netbios函数,里面
封装了所有函数和数据结构,用起来很方便,在BC和VC下都如此。
可是由于这次是使
用流行的Delphi作编译器,却遇到了意想不到的麻烦:号称全面移植
WIN32API的Dlphi
中偏偏没有Netbios函数!这下顿时让我方寸大乱。怎么办?总不能从
底层干起吧?而且
时间也不允许。在冷静下来之后,我忽然想到,既然WIN95支持
NetBIOS,那么系统就
一定会提供DLL支持,编译器本身是没有底层支持的。于是我在机器
中搜索,果然,
在SYSTEM目录下有一个Netbios.dll,用快速查看将
其打开,在导出表部分显示如下:
  导出表:
  序数 入口 名称
  0000 00001a37 NetbiosAddthd
  0001 000019eb NetbiosDelete
  0002 00001a96 NetbiosDelthd
  0003 000019b1 NetbiosInitialize
  0004 0000186b PostRoutineCaller
  0005 0000102e _Netbios
  注意到那个0005号_Netbios导出函数了吗?那就是我需要的!经
过紧张的试验调
试,证明它和WIN32API手册上的Netbios完全一样。剩下的工作就比
较简单了,定义
一个NCB(Netbios控制块)记录,将NCB数据结构封装在里面;声明一
个后处理例程以
及消息处理过程,以完成广播数据的接收和发送。有关NCB数据结构
的详细内容以及
NetBIOS广播的原理,限于篇幅我就省略了。需要的朋友可以查看BC
或VC的Help或相
关书籍。下面是有关的Delphi源代码。
  /////////Netbios单元///////////
  unit netbios;
  interface
  uses windows,messages,Forms,SysUtils;
  type
  {$X+}{$A+}
   //声明一个NCB记录指针。
   PNCB=^NCB;
  //声明一个后处理例程的过程类型。
   POST=procedure(var ncbR:PNCB);
   //以下是NCB记录,教训1:将上面的编译选项置为{$A+}以
取消数据对齐。
如果在广播中有浮点数的话,数据对齐会让你大吃苦头!我已经有过
惨痛教训!:(
   NCB=record
   ncb_command:UCHAR;
   ncb_retcode:UCHAR;
   ncb_lsn:UCHAR;
   ncb_num:UCHAR;
   ncb_buffer:PCHAR;
   ncb_length:WORD;
   ncb_callname:array [1..16] of UCHAR;
   ncb_name:array [1..16] of UCHAR;
   ncb_rto:UCHAR;
   ncb_sto:UCHAR;
   ncb_post:POST;
   ncb_lana_num:UCHAR;
   ncb_cmd_cplt:UCHAR;
   ncb_reserve:array [1..10] of UCHAR;
   ncb_event:HANDLE;
   end;
  //声明自己的Netbios函数。教训2:一定要使用pascal调用规
范,否则,嘿嘿!!
  function NetbiosSR(ncbX:PNCB):UCHAR;pascal;
  //初始化NCB。
  procedure InitNCB(var ncbY:PNCB);
  //后处理例程,注意使用远指针。
  procedure postrout(var ncbR:PNCB);stdcall;far;
  var
   char_buffer:array[0..511]of UCHAR;
   int_buffer:array[1..512]of Byte;
  implementation
   //调用系统的Netbios。dll中的Netbios函数标号是6。Delphi
搜索外部文件的
顺序是当前目录→系统目录→其他目录,别忘了保证存在
Netbios.dll。
   function NetbiosSR(ncbX:PNCB):UCHAR;external
‘netbios' index 6;
   procedure InitNCB(var ncbY:PNCB);
   var
   x:integer;
   begin
   ncbY.ncb_command:=0;
   ncbY.ncb_retcode:=0;
   ncbY.ncb_lsn:=0;
   ncbY.ncb_num:=0;
   ncbY.ncb_length:=512; //数据缓冲长度,最大512B。
   for x:=1 to 16 do
   begin
   ncbY.ncb_callname[x]:=0;
   ncbY.ncb_name[x]:=0;
   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;
  //后处理例程的作用是当接收到广播消息时,立即向相应窗口
发送消息。我在
这里偷了点懒,以广播方式发送一个定时器消息。如果你愿意可以
向指定窗口发送
自定义消息,这样要复杂一些。首先,要把指定窗口的句柄传递给
后处理例程。通
常这是做不到的,但可以利用一些技巧做到。在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}
   //消息处理过程,注意消息宏要与后处理中的一致。
   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;
   //取后处理例程的地址。
   ncbRock.ncb_buffer:=@char_buf
  fer; //取数据缓冲区的地址。
   InitNCB(ncbRock);
   ret:=9;
   ncbname:=random(100);
   ncbRock.ncb_name[1]:=ncbna
  me;
   ncbRock.ncb_command:=$30;
   //加名,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; //异步接收方式字。
   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
   //取出数据缓冲区的内容
   for x:=0 to 511 do
   int_buffer[x+1]:=char_buffer[x];
   ////以下可以进行数据处理////
   //重新打开异步接受。
   ncbRock.ncb_post:=post_add;
   ncbRock.ncb_command:=$a3;
   ncbRock.ncb_event:=0;
   ncbRock.ncb_length:=512;
   ret:=netbiosSR(ncbRock);
  end;
  end.
  注:广播发送非常简单,不再详述。上述程序经过一年运行完全
可靠。另外,
经过改造可以将其改为LAN下的聊天程序。
有什么问题可以Email到ywfirefly@ynmail.com与我联系。欢迎切磋
////////////////////////////////////////////////////////////////////////////
 
to beta:
我以前做过一个捕捉屏幕的程序,用的是nmudp控件. 这个程序能够获得指定Ip的电脑
的屏幕.但是好像不能做到很好的实时监控.主要是数据传送的瓶颈.我想如果要做一个
象超级解霸那样广播播放视频文件,如何获得这些数据以及采出怎样的方式传送是个关键
能不能给我一个详细的答复.不胜感激.
另外我还不知道用nmudp控件实现广播.请高高手献技.献计
 
怎么没有人理我啊?
 
还是没有人回答我
 
还是没有人回答我
 
难道没有人会?
 
怎么没有人回答我
 
我的一个哥们作过实时监控的程序,用的好象是mpeg4的协议规范。效果不错!
至于广播,其实站用的也是一份带宽,这个应该不会有影响吧。
 
叫你的哥们来这里露把脸再走:)
 
既然在内网,我想可不可以UDP数据接力传输呢?当然最后一台电脑很慢,猜想可以用缓冲
的方式解决吧,就怕中途一台电脑死机了,死了的话我想可以再请求SVR源的
mpeg估计没什么好再压缩的了,局域网也就是10M的样子,我认为关键还是细节方面的问题
比如发送方对数据的读取、发送、调和,接收方的解码、提出请求等等,这些在算法上重点
研究一下,必要的地方使用汇编来做,在delphi中看起来很短很精炼的语句其实是很慢的
CPU太快了也不是个好事情,给人一种视觉心理上的蒙蔽
 
to zhengjunfeng:
是啊,叫你的哥们露一手嘛,在下万分感激!!!!!
 
后退
顶部