我们在编制网络应用程序时,经常需要将一份消息同时发送给网络上的所有用户,这叫做消息的广播。网络消息的广播技术在编制多媒体网上演示、网络会议等程序时有重要的意义。
一、技术要点分析
本文所介绍的网络技术是利用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)。它将会把填在编辑框中的消息在网络中广播出去。
以上程序在VC++6.0、Windows 98上编译通过,运行正常。
转载地址:http://www.voipchina.cn/technology/2004-03-24/36850.shtml