[C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果。

一、程序实现

UDP广播程序的实现代码:

 

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;namespace UDPBroadcast
{/// <summary>/// 在界面上,用户可以设置本地进程的IP地址和端口号,并将地址加入某个组播组;/// 可以输入发送消息的目的组的地址,并且勾选“广播”复选框将采用广播的方式发送信息/// 在界面上点击“接受按钮”就启动接收线程,这样程序就可以接收广播或组播的信息/// </summary>public partial class UdpBroadcasefrm : Form{private UdpClient sendUdpClient;private UdpClient receiveUdpClient;// 组播IP地址IPEndPoint broadcastIpEndPoint;public UdpBroadcasefrm(){InitializeComponent();IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());tbxlocalip.Text = ips[5].ToString();tbxlocalport.Text = "8002";// 默认组,组播地址是有范围// 具体关于组播和广播的介绍参照我上一篇博客UDP编程// 本地组播组tbxGroupIp.Text = "224.0.0.1";// 发送到的组播组tbxSendToGroupIp.Text = "224.0.0.1";}// 设置加入组private void chkbxJoinGtoup_Click(object sender, EventArgs e){if (chkbxJoinGtoup.Checked == true){tbxGroupIp.Enabled = false;}else{tbxGroupIp.Enabled = true;tbxGroupIp.Focus();}}// 选择发送模式后设置private void chkbxBroadcast_Click(object sender, EventArgs e){if (chkbxBroadcast.Checked == true){tbxSendToGroupIp.Enabled = false;}else{tbxSendToGroupIp.Enabled = true;tbxSendToGroupIp.Focus();}}// 发送消息private void btnSend_Click(object sender, EventArgs e){if (tbxMessageSend.Text == ""){MessageBox.Show("消息内容不能为空!","提示");return;}// 根据选择的模式发送信息if (chkbxBroadcast.Checked == true){// 广播模式(自动获得子网中的IP广播地址)broadcastIpEndPoint = new IPEndPoint(IPAddress.Broadcast, 8002);}else{// 组播模式broadcastIpEndPoint = new IPEndPoint(IPAddress.Parse(tbxSendToGroupIp.Text), 8002);}// 启动发送线程发送消息Thread sendThread = new Thread(SendMessage);sendThread.Start(tbxMessageSend.Text);}// 发送消息private void SendMessage(object obj){string message = obj.ToString();byte[] messagebytes = Encoding.Unicode.GetBytes(message);sendUdpClient = new UdpClient();// 发送消息到组播或广播地址sendUdpClient.Send(messagebytes, messagebytes.Length, broadcastIpEndPoint);sendUdpClient.Close();// 清空编辑消息框ResetMessageText(tbxMessageSend);}// 利用委托回调机制来实现界面上的消息清空操作delegate void ResetMessageTextCallBack(TextBox textbox);private void ResetMessageText(TextBox textbox){if (textbox.InvokeRequired){ResetMessageTextCallBack resetMessageCallback = ResetMessageText;textbox.Invoke(resetMessageCallback, new object[] { textbox });}else{textbox.Clear();textbox.Focus();}}// 接收消息private void btnReceive_Click(object sender, EventArgs e){chkbxJoinGtoup.Enabled = false;// 创建接收套接字IPAddress localIp = IPAddress.Parse(tbxlocalip.Text);IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse(tbxlocalport.Text));receiveUdpClient = new UdpClient(localIpEndPoint);// 加入组播组if (chkbxJoinGtoup.Checked == true){receiveUdpClient.JoinMulticastGroup(IPAddress.Parse(tbxGroupIp.Text));receiveUdpClient.Ttl = 50;}// 启动接受线程Thread threadReceive = new Thread(ReceiveMessage);threadReceive.Start();}// 接受消息方法private void ReceiveMessage(){IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);while (true){try{// 关闭receiveUdpClient时此时会产生异常byte[] receiveBytes = receiveUdpClient.Receive(ref remoteIpEndPoint);string receivemessage = Encoding.Unicode.GetString(receiveBytes);// 显示消息内容ShowMessage(lstMessageBox, string.Format("{0}[{1}]", remoteIpEndPoint, receivemessage));}catch{break;}}}// 通过委托回调机制显示消息内容delegate void ShowMessageCallBack(ListBox listbox,string text);private void ShowMessage(ListBox listbox, string text){if (listbox.InvokeRequired){ShowMessageCallBack showmessageCallback = ShowMessage;listbox.Invoke(showmessageCallback, new object[] { listbox, text });}else{listbox.Items.Add(text);listbox.SelectedIndex = listbox.Items.Count - 1;listbox.ClearSelected();}}// 清空消息列表private void btnClear_Click(object sender, EventArgs e){lstMessageBox.Items.Clear();}// 停止接收private void btnStop_Click(object sender, EventArgs e){chkbxJoinGtoup.Enabled =true;receiveUdpClient.Close();}}
}

广播演示结果(接收端直接点接收按钮后开启接受线程,在发送端勾选“广播选项”输入发送信息点发送按钮后的界面如下):

 

下面通过把接收端加入组后的结果,首先终止接收线程,然后勾选“加入组”复选框,然后单击“接收”按钮重新开启接收线程,输出结果如下:

从广播演示的两个情况可以看出广播消息会同时向网上的一切进程转发,无论这个进程是独立的还是加入了某个组播组中的进程,都可以接收广播消息

下面演示下组播的结果:

如果把接收端的组地址改为224.0.0.3时,此时发送端发送的消息“组播演示2”将不会发送到不同的组播地址,则接收端就接收不到此时的消息。

从组播结果中可以看出只有加入组播地址224.0.0.2的进程才能接收到信息。

 

需要注意的地方是:从前面的截图中可以看出,不论是广播还是组播,仅仅从收到的信息无从知道发送给它的进程的端口号,所以广播和组播消息都是匿名发送,并且通过对UDP广播和组播的理解可以简单实现一个消息群发的功能(QQ的群里聊天就是这个原理)。

 

二、 总结

本专题主要是针对上一专题的补充——实现一个简单的UDP广播(组播)程序,通过这样一个发送端可以发送给在组播地址中的所有用户和所有子网中的所有用户。本专题可以说是对UDP编程的一个扩充吧,希望大家看了本专题后可以对UDP协议有大致的理解。在下一个专题中会和大家介绍下P2P编程的相关知识。

 全部源码地址:http://files.cnblogs.com/zhili/UDPBroadcast.zip

 

转载于:https://www.cnblogs.com/ShaYeBlog/archive/2012/09/26/2703991.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们离得开美国的软件和硬件吗?

来源&#xff1a;网易科技摘要&#xff1a;据报道&#xff0c;你当然可以淘汰很多美国产品&#xff0c;但你可能也会因此放弃许多令人惊叹的功能。据报道&#xff0c;你当然可以淘汰很多美国产品&#xff0c;但你可能也会因此放弃许多令人惊叹的功能。例如&#xff0c;超过10亿…

❤️❤️❤️【资料免费领取】简历模板、职场PPT模板、硬核学习资料+PDF资料(Java、Python、大数据、机器学习)❤️❤️❤️

&#x1f345;【领取方法】 长按识别二维码&#xff0c;回复【资料】领取 目录 1、100套小编购买的简历模板&#xff08;部分截图&#xff09; 2、1000套精品PPT模板&#xff08;部分截图&#xff09; 3、大数据-学习资料&#xff08;1.3G 硬核PDF&#xff0c;官方指南&…

超20亿!2018年国家自然科学基金(重点项目)出炉!

来源&#xff1a;青塔摘要&#xff1a;8月16日&#xff0c;2018年国家自然科学基金评审结果正式揭晓。8月16日&#xff0c;2018年国家自然科学基金评审结果正式揭晓。继昨天发布了2018年国家优青项目各单位的立项情况后&#xff0c;青塔今天又整理重点项目的立项情况和完整名单…

❤️ 珊姐带你学JavaScript:数组和函数 (万文建藏)❤️

&#x1f345; 作者&#xff1a;阿珊 &#x1f345; 简历模板、职场PPT模板、技术交流尽管关注私聊我。 &#x1f345; 期许&#xff1a;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; 热门专栏推荐&#xff1a; &#x1f947; 大数据集锦…

产业|中国电子学会发布《机器人十大新兴应用领域(2018-2019年)》

来源&#xff1a; 中国电子学会8月19日&#xff0c;2018世界机器人大会胜利闭幕&#xff0c;闭幕式上中国电子学会发布了《发布机器人十大新兴应用领域&#xff08;2018-2019年&#xff09;》。当前&#xff0c;全球正在经历科技、产业、资本高度耦合、深度迭加的新一轮变革&am…

2018-2019年新一代AI领域十大最具成长性技术展望

来源&#xff1a;网络大数据摘要&#xff1a;在2018世界机器人大会17日的主论坛上&#xff0c;中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》。当前&#xff0c;全球正在经历科技和产业高度耦合、深度迭加的新一轮变革&#xff0c;大数据的形成、…

wzplayer for android V1.0

V1.0上图,哈哈 转载于:https://www.cnblogs.com/weinyzhou/archive/2012/10/12/2750055.html

全球公有云巨头:亚马逊 AWS

来源&#xff1a;乐晴智库精选摘要&#xff1a;亚马逊AWS目前拥有超过1500种产品和2100余种第三方模块&#xff0c;为全球190个国家的企业提供支持。AWS作为亚马逊旗下的云计算服务平台&#xff0c;面向全世界范围的用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云…

❤️爆肝新一代大数据存储宠儿,梳理了2万字 “超硬核” 文章!❤️

&#x1f345; 作者&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有…

埃森哲:技术改变看病的五大趋势!每个人都将受益【附下载】| 智东西内参...

来源&#xff1a;智东西摘要&#xff1a;解读五大科技趋势及其对生活的影响&#xff0c;盘点新兴技术对医疗健康产业的影响案例。全球医疗水准已经达到一个临界点&#xff0c;那就是与技术的深度碰撞&#xff0c;商业与个人医疗的界限在模糊。医疗机构越来越重视智能化技术的作…

《画解算法》1.两数之和【python实现】

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;…

工业AI时代,大数据云平台未来5年迎最佳发展时机

来源&#xff1a;专知摘要&#xff1a;继德国工业 4.0 的提出&#xff0c;中国也确立了“中国制造 2025”的目标&#xff0c;工业 4.0 及物联网的概念在中国大地上遍地开花&#xff0c;整个行业也是红红火火。从工业大数据到智能制造&#xff0c;工业大数据云平台将为工业创新和…

噪音 - Perlin Noise

转载自&#xff1a;http://www.cnblogs.com/babyrender/archive/2008/10/27/BabyRender.html 说起perlin noise, 最初也就是在课上大概了解了一下, 知道是个生成仿真贴图的东西. 学的时候没怎么细想, 只是知道这个东西很快. 生成3d贴图很方便. 不过最近在做sampling的时候, 发现…

《画解算法》2.整数反转【python-简单】

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、信息技术智库公号作者✌。简历模板、职场PPT模板、技术难题交流、面试套路尽管【关注】私聊我。 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;…

360:中国为什么没有自主研发的浏览器内核?

来源&#xff1a;360公司物联网智库 整理发布摘要&#xff1a;近日360公司发表题为《中国为什么没有自主研发的浏览器内核&#xff1f;》的文章&#xff0c;文章中写道&#xff1a;从0到1&#xff0c;从无到有&#xff0c;这是很多人理解的自主研发&#xff0c;按这个标准&…

❤️ 炒 股 实 战丨原 地 起 飞 ❤️

郑重声明&#xff1a; 1、个人版可以免费获取交易数据进行分析&#xff0c;企业级大规模调用数据需要购买积分&#xff08;大家玩玩即可&#xff09; 2、为避免广告代言&#xff0c;本文将不会出现任何logo、链接和包&#xff0c;需要玩的主页私聊我&#xff01; &#x1f345…

人工智能研究的新前线:生成式对抗网络

林懿伦, 戴星原, 李力, 王晓, 王飞跃来源&#xff1a;科学网 摘要&#xff1a;生成式对抗网络&#xff08;Generative adversarial networks, GAN&#xff09;是当前人工智能学界最为重要的研究热点之一。其突出的生成能力不仅可用于生成各类图像和自然语言数据&#xff0c;还启…

中国自动化学会平行智能专业委员会成立

摘要&#xff1a;2018年8月18日上午&#xff0c;中国自动化学会平行智能专业委员会成立大会在中国科学院自动化研究所报告厅隆重举行。2018年8月18日上午&#xff0c;中国自动化学会平行智能专业委员会成立大会在中国科学院自动化研究所报告厅隆重举行。中国科学院院士吴宏鑫教…

2008-2018,5个版本互联网大脑模型的演进与对比

2018年8月&#xff0c;我们绘制的第五个版本的互联网大脑模型图&#xff0c;新的版本相当于为互联网找到了左右大脑的机制-机器智能左大脑和群体智能右大脑。第五版的绘制距离2008年第一个版本正好10年。互联网大脑模型主要是针对1969年以来互联网的网状模型&#xff0c;在21世…

2.安装MySQL

2.安装MySQL Mac系统中安装MySQL 使⽤用Mac中的Homebrew进⾏行行mysql的安装 1.下载安装mysql brew install mysql5.7 如果看到以下界⾯面则表示已经下载安装成功 2.启动mysql mysql.server start 3.关闭mysql mysql.server stop 4.登录mysql mysql -u root -p Windows安…