利用特殊IP地址实现网络广播

huihuiwang 2000-07-15 09:51:00
加精

利用特殊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 本地环路

...全文
217 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tails 2001-02-23
  • 打赏
  • 举报
回复

这只能向一个网段发送,实际上使用的是TCP/IP中的UDP协议,如果你有用过DELPHI,看看上面的winsoket 控件的例子,就明白了。

huihuiwang,可以一次向不同网段发送消息吗?just like OICQ?

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧