C#网络编程专题7UDP编程补充.doc_第1页
C#网络编程专题7UDP编程补充.doc_第2页
C#网络编程专题7UDP编程补充.doc_第3页
C#网络编程专题7UDP编程补充.doc_第4页
C#网络编程专题7UDP编程补充.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C# 网络编程系列专题七:UDP编程补充UDP广播程序的实现(转载: /zhili/archive/2012/08/23/WebServer.html )上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果。一、程序实现UDP广播程序的实现代码: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace UDPBroadcast / / 在界面上,用户可以设置本地进程的IP地址和端口号,并将地址加入某个组播组; / 可以输入发送消息的目的组的地址,并且勾选“广播”复选框将采用广播的方式发送信息 / 在界面上点击“接受按钮”就启动接收线程,这样程序就可以接收广播或组播的信息 / 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 = ips5.ToString(); tbxlocalport.Text = 8002; / 默认组,组播地址是有范围 / 具体关于组播和广播的介绍参照我上一篇博客UDP编程 / 本地组播组 tbxGroupIp.Text = ; / 发送到的组播组 tbxSendToGroupIp.Text = ; / 设置加入组 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(01, 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(); 广播演示结果(接收端直接点接收按钮后开启接受线程,在发送端勾选“广播选项”输入发送信息点发送按钮后的界面如下): 下面通过把接收端加入组后的结果,首先终止接收线程,然后勾选“加入组”复选框,然后单击“接收”按钮重新开启接收线程,输出结果如下: 从广播演示的两个情况可以看出广播消息会同时向网上的一切进程转发,无论这个进程是独立的还是加入了某个组播组中的进程,都可以接收广播消息下面演示下组播的结果: 如果把接收端的组地址改为时,此时发送端发送的消息“组播演示2”将不会发送到不同的组播地址,则接收端就接收不到此时的消息。 从组播结果中可以看出只有加入组播地址的进程才能接收到信息。 需要注意的地方是:从前面的截图中可以看出,不论是广播还是组播,仅仅从收到的信息无从知道发送给它的进程的端口号,所以广播和组播消息都是匿名发送,并且通过对UDP广播和组播的理解可以简单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论