请教:如何使用NMUDP控件实现UDP广播效果?

yxtk 2001-02-10 01:12:00
哪位知道如何使用NMUDP控件实现UDP广播效果?
依稀记得是把接收IP设成一个特殊的地址就可以了,但不记得具体是什么了.
...全文
274 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yxtk 2001-02-11
谢谢各位,经过各位提醒,我发现可以这样实现:
如果我的IP为168.192.0.1子网掩码:255.255.255.0
那么把NMUDP中接受地址设为168.192.255.255就可以实现在子网内广播
回复
TangSe 2001-02-11
设成255.255.255.255不行!!!系统返回“找不到该地址”。
回复
NowCan 2001-02-11
设成255.255.255.255好像不行。
回复
yousoft2013 2001-02-10
将IP设置为255.255.255.255试试!理论上是这样的,我没有条件测试!
这有篇文章:你可以看看!
利用特殊IP地址实现网络广播
我们在编制网络应用程序时,经常需要将一份消息同时发送给网络上的所有用户,这叫做消息的广播。网络消息的广播技术在编制多媒体网上演示、网络会议等程序时有重要的意义。

  一、技术要点分析

  本文所介绍的网络技术是利用IP协议中的特殊地址实现的。IP协议是建立TCP/IP网络的最基本协议,它定义了在整个TCP/IP网络上传输数据所用的基本单元。

  在使用TCP/IP协议的网络环境中,一台计算机有一个主机地址,同时,一个网络也被分配了一个网络地址(见表1)。

  为了方便处理一些特殊的数据发送要求,IP协议中定义了一套自己保留的特殊IP地址,称为保留地址,保留的IP地址是从不分配给某台特定的主机的。

  注:在IP地址中,可分成网络标识符及主机编号两部分。例如一个C类地址192.168.1.1,则它的网络标识符为192.168.1,主机编号为1。所有的保留IP地址只能当作源地址使用。

  TCP/IP协议规定,主机编号各位全为“1”的网址用于广播之用,叫广播地址。网络标识符和主机编号的32比特位全为“1”的网址用于本网广播,该地址叫作有限广播地址(linited broadcast address)。主机在启动过程中,往往不知道本网的网址(即本网网络号),这时候,若想向本网广播,只能采用有限广播地址。在协议中规定,各位全为“0”的网址被解释成“本”网络。若主机试图在本网内通信,而又不知道本网网络号,可以利用该地址。

  我们在利用保留IP地址进行网络广播时,将使用网络的直接广播地址。由于程序是基于IP协议编写的,因此编程时要使用Socket编程,而不使用WININET。

  二、范例程序的实现与代码分析

  我们利用Visulal C++ 的向导生成一个基于对话框的程序,命名为NetBrocast。

  利用ClassWizard为程序加入一个基类为CAsyncSocket,并命名为CServerSocket的类。其源程序代码如下:

  

  1.定义CServerSocket类的头文件

  ……

  //省略机器生成的代码

  class CServerSocket : public CAsyncSocket

  {

  ……

  //省略机器生成的代码

  public:

  //为了支持多用户,我们为每一个申请连接的客户端生成一个Socket

   UINT OrderList; //连接后的Socket序列号

   CServerSocket SendSocket[255];

  //连接后的Socket数组

  //{{AFX_VIRTUAL(CServerSocket)

   public:

   virtual void OnAccept(int nErrorCode);

  //重载它的响应连接函数

   //}}AFX_VIRTUAL

  };

  

  2.编写CServerSocket类的实现文件

  ……

  //省略的机器生成代码

  CServerSocket::CServerSocket()

  {

  //初始Socket序列号

   OrderList=0;

  }

  ……//省略的机器生成代码

  void CServer::OnAccept(int nErrorCode)

  //响应连接请求的消息函数

  {

  //接受客户端发出的连接请求,完成连接,实现一个可收发数据的Socket

   SendSocket[OrderList]=NULL;

   SendSocket[OrderList]=new CServerSocket();

  //初始化一个新的Socket

   this-〉Accept((SendSocket[OrderList]));

  //生成一个新的连接后的Socket

   OrderList++;

  }

  

  3.编写主对话框代码的头文件

  ……

  //省略的机器生成代码

  class CServerSocket;

  class CNetBrocastDlg : public CDialog

  {

  public:

   CServerSocket ServerSocket;

  ……

  //省略的机器生成代码

  //{{AFX_DATA(CNetBrocastDlg)

   enum { IDD = IDD_NETBROCAST_DIALOG };

   CEdit m_SendMessge;

  //装载要发送的信息的编辑框

   //}}AFX_DATA

  ……

  //省略的机器生成代码

  //{{AFX_MSG(CNetBrocastDlg)

   virtual BOOL OnInitDialog(); //响应初始化

  ……

  //省略的机器生成代码

   afx_msg void OnSend(); //响应按钮"Send"的操作

   //}}AFX_MSG

   DECLARE_MESSAGE_MAP()

  };

  

  4.编写主对话框代码的实现文件

  #include "serverSocket.h"

  ……

  //省略的机器生成代码

  BOOL CNetBrocastDlg::OnInitDialog()

  {

  ……

  //省略的机器生成代码

   ServerSocket=new CServerSocket();

  //生成一个ServerSocket类

   ServerSocket-〉Create(1024,SOCK_STREAM);

  //开始倾听连接

   ServerSocket-〉Listen();

   return TRUE; }

  //下面的这个函数是按钮“Send”的响应函数,该函数将向网络上所有主机广播消息

  void CNetBrocastDlg::OnSend()

  {

   CString String;

   m_SendMessge.GetWindowText(String);

  //下面这行代码将向C类地址中的网络标识为“192.168.0”的网络进行广播

   ServerSocket-〉SendSocket[0]-〉SendTo(String,String.GetLength(),

  1024,"192.168.0.255",0);

  }

  //下面的函数响应按钮“Quit”的单击操作,退出程序

  void CNetBrocastDlg::OnOK()

  {

   ServerSocket-〉Close();

  //关闭Socket

   CDialog::OnOK();

   }

  编译完成后,得到网络广播的服务器端的演示程序(如图1)。它将会把填在编辑框中的消息在网络中广播出去。

  图1

  以上程序在VC++6.0、Windows 98上编译通过,运行正常。

表1 保留IP地址格式 示例 说明
网络标识符为0 . 主机编号为0 000.000.000.000 本地网络上的本主机
网络标识符为0 . 主机编号为1 000.000.000.1 本地网络上的特定编号的主机
  . 主机编号为0 192.168.0.0 网络的伯克利广播
网络标识符全1 . 主机编号全1 255.255.255.255 本地网的有限广播
  . 主机编号全1 192.168.0.255 网络的直接广播
网络标识符为127 . 主机编号任意 127.0.0.1 本地环路
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2001-02-10 01:12
社区公告
暂无公告