TAG:
我们在编制网络应用程序时,经常需要将一份消息同时发送给网络上的所有用户,这叫做消息的广播。网络消息的广播技术在编制多媒体网上演示,网络会议等程序时有重要的意义。 程序中的技术要点分析 本文中所介绍的网络技术是利用IP协议中的特殊地址实现的。IP协议是建立TCP/IP网络的最基本协义,它定义了在整个TCP/IP网络上传输数据所用的基本单元。 在使用TCP/IP协议的网络环境中,一台计算机有一个主机地址,同时,一个网络也被分配了一个网络地址。为了方便处理一些特殊的数据发送要求,IP协议中定义了一套保留的特殊IP地址,称为保留地址,保留的IP地址是从不分配给某台特定的主机的。 保留IP地址格式 示例 说明 全0 000.000.000.000 本地网络上的本主机 网络标识符为0 . 主机编号为 000.000.000.1 本地网络上的特定编号的主机 网络标识符 . 主机编号为0 192.168.0.0 网络的伯克利广播 全1 255.255.255.255 本地网的有限广播 网络标识符 . 主机编号全1 192.168.0.255 网络的直接广播 127 . 任意 127.0.0.0 本地环路 注:在IP地址中,可分成网络标识符及主机编号两部分。例如一个C类地址192.168.1.1,则它的网络标识符为192.168.1,主机编号为1。所有的保留IP地址只能当作源地址使有。 我们在利用保留IP地址进行网络广播时,将使用网络的直接广播地址。由于程序基于IP协议,因此编程时要使用SOCKET编程,而不使用WININET(虽然WININET使用起来非常方便,但对付真正应用INTERNET协议的编程操作时,有点力不从心) 二、范例程序的实现与代码分析 我们利用Visulal C++ 的向导生成一个基于对话框的程序,命名为NetBrocast。修改主对话框如右图。利用ClassWizard为程序加入一个基类为CAsyncSocket的名为CServerSocket的新类。修改程序中的代码如下:(黑体部分为应由用户手工加入的代码) //代码段一,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 }; //代码段二,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++; } //代码段三,主对框代码的头文件 ……//省略的机器生成代码 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() }; //代码段四,主对框代码的实现文件, #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(); } 编译完成后,得到网络广播的服务器端的演示程序。它将会把填在编辑框中的消息在网络中广播出去。 以上程序在VC++6.0,中/英文Windows 98上编译通过,运行正常。 作者电邮:Alexandrite@cmmail.com 下载代码 作者姓名: 苏水荣 作者地址:广东省韶关市韶关教育学院98计算机(1)班 邮 编: 512026 电 话: 0751-8626470 (jacky) |