UDP协议下广播和多播的实现

时间:2022-08-26 08:05:17

UDP协议下广播和多播的实现

摘要:UDP是一项非常实用可行的网络传输层协议,现在广泛应用于各行各业,并将在今后发挥更大的作用。本文详细阐述了Delphi5.0开发环境下广播与多播的一种实现方法。

关键词:UDP协议;广播;多播;Delphi5.0

中图分类号:TP311.1 文献标识码:A文章编号:1007-9599 (2011) 05-0000-01

Implementation of Broadcast and Multicast under the UDP Protocol

Zhang Wei12,Zhang Huanjun1,Cheng Xiao2

(1.Shenyang Ligong University,Shenyang110168,China;

2.Sicong Co.,Ltd.,Xian710043,China)

Abstract:UDP is a very practical and feasible network transmission layer protocols,now widely used in many fields in the future,and will play a greater role.This paper expounds the development environment Delphi5.0 next Broadcast and multicast a software design method.

Keywords:UDP protocol;Broadcast;Multicast;Delphi5.0

在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通讯,UDP为应用层提供了一种非常简单的服务,它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。与TCP相比UDP的优势就在于它排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,保证了运行速度。单播、广播、组播则表示的是数据在网络中“播放”的形式,是指有一个人能听到还是让特定的人群听得到,还是让所有的人都听的到的区别。一台主机要向网上的所有其他主机发送帧,这就是广播;多播处于单播和广播之间,向属于多播组的多个主机发送帧。

一、广播与多播的实现

下面我们就详细介绍一下Delphi5.0开发环境下广播和多播的实现。软件开发步骤如下:

(一)网络初始化

1.首先初始化WinSock动态连接库,创建Socket套接字,用下面语句绑定发送方Addr:

Addr.sin_family:=AF_INET;

Addr.sin_addr.S_addr:=INADDR_ANY;//本机接收地址设为任意地址

Addr.sin_port:=htons(UDPPORT); //设定本机UDP端口号

函数htons将端口号由主机字节顺序转换为网络字节顺序,然后将套接字绑定到一个本地地址和端口上(bind),设置为异步选择,设定接收端SockAddrIn:

FSockAddrIn.SIn_Family:=AF_INET;

FSockAddrIn.SIn_Port:=htons(UDPPORT);//接收端端口设置

2.广播接口设置。广播方式有两种,一种是limited broadcast,广播地址是255.255.255.255;一种是directed broadcast。limited broadcast初始化时代码如下: SetSockopt(FSocket,SOL_SOCKET,SO_BROADCAST,@broadcast,sizeof(broadcast));

directed broadcast不需要SetSockopt(),以标准的C类网为例,直接发送x.x.x.255就可以了。这种广播只有同一逻辑子网中的机器才能收到,也就是说对方地址应该是x.x.x.y,如果不是,即使在同一物理子网中也是收不到的。当然,这和子网掩码有关。limited broadcast广播的好处是只要在同一子网中的主机,就可以收到这种广播,而不必非要在统一逻辑子网中。例如,如果你的地址是x.x.x.1,那么这种广播,地址是x.y.z.a的主机也能收到。

3.多播接口设置。mreq.imr_multiaddr.S_addr:=inet_addr(pchar(MY_GROUP));//设定多播地址mreq.imr_interface.S_addr:=htonl(INADDR_ANY);//设定本机接收端口。

(二)网络数据的读取

flen:=sizeof(FSockAddrIn);//获取字节长度

FSockAddrIn.SIn_Port := htons(UDPPORT);//设定本机接收端口

Event:=WSAGetSelectEvent(Message.LParam);//接收到数据后触发消息事件

if Event=FD_READ then

begin

len:=recvfrom(FSocket,buffer,sizeof(buffer),0,FSockAddrIn,flen);

value:=copy(buffer,1,len);//网络数据接收,buffer是缓冲区。

(三)网络数据的发送。

首先定义一个string变量和一个integer变量,然后设置远端主机地址:

FSockAddrIn.SIn_Addr.S_addr:=inet_addr(pchar(Edit1.text));

value:=Content;

len:=sendto(FSocket,value[1],Length(value),0,FSockAddrIn, sizeof(FSockAddrIn)); //网络数据发送

if(WSAGetLastError() WSAEWOULDBLOCK)and(WSAGetLastError() 0)then //网络数据发送异常判断

showmessage(inttostr(WSAGetLastError()));

(四)关闭网络接口

CloseSocket(FSocket);//关闭Socket

二、结束语

经测试,该软件能成功实现UDP协议下的广播和多播。测试结果如图1、图2所示。

图1 UDP广播测试结果图2UDP多播测试结果

参考文献:

[1]袁振武.谢任东.谈Delphi编程中UDP协议的应用[J].科技广场,2008,05

[2]芦东昕,张华强.基于UDP的可靠数据传递技术[J].计算机工程,2003(29)

上一篇:推进井身结构优化 加强钻井成本控制 下一篇:浅析计算机信息网络安全策略