返回顶部
首页 > 资讯 > 精选 >C#中如何进行UDP编程补充
  • 680
分享到

C#中如何进行UDP编程补充

2023-06-17 09:06:43 680人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关C#中如何进行UDP编程补充,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下面就直接介绍实现过程和代码以及运行的结果。一、程序实现UDP广播程序的实现代码:using&n

这期内容当中小编将会给大家带来有关C#中如何进行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();          }        }  }

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

C#中如何进行UDP编程补充

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

C#中如何进行UDP编程补充

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

下面演示下组播的结果:

C#中如何进行UDP编程补充

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

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

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

二、 总结

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

上述就是小编为大家分享的C#中如何进行UDP编程补充了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: C#中如何进行UDP编程补充

本文链接: https://lsjlt.com/news/288118.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中如何进行UDP编程补充
    这期内容当中小编将会给大家带来有关C#中如何进行UDP编程补充,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下面就直接介绍实现过程和代码以及运行的结果。一、程序实现UDP广播程序的实现代码:using&n...
    99+
    2023-06-17
  • 如何进行MySQL双主补充
    今天就跟大家聊聊有关如何进行MySQL双主补充,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。环境:主机名       ...
    99+
    2024-04-02
  • 如何进行C++多线程编程?
    如何进行C++多线程编程随着计算机硬件的不断发展,多核处理器已经成为现代计算机的主流。为了充分利用多核处理器的性能,多线程编程成了一个重要的技能。C++是一门强大的编程语言,也提供了很多多线程编程的工具和库。本文将介绍如何进行C++多线程编...
    99+
    2023-11-04
    编程 多线程编程 C++ 多线程
  • 如何进行Visual C++界面编程
    如何进行Visual C++界面编程,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为了能有这个功能,我写了下面的这个函数。首先得在你的对话框中添加一个的WM_C...
    99+
    2023-06-17
  • 如何使用C++进行网络编程?
    随着互联网的发展,网络编程越来越成为计算机科学的重要组成部分。C++作为一种强大的编程语言,也对网络编程提供了不少支持。本文将介绍如何使用C++进行网络编程。网络编程概述网络编程是指编写程序用于使用计算机网络进行通信的过程。网络编程需要使用...
    99+
    2023-11-03
    Socket编程 C++网络编程 网络套接字
  • 如何在Pytorch中对tensor进行扩充
    今天就跟大家聊聊有关如何在Pytorch中对tensor进行扩充,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。b = torch.zeros((3, 2...
    99+
    2023-06-06
  • 如何进行C++代码的异步编程?
    如何进行C++代码的异步编程?在软件开发领域,异步编程(Asynchronous Programming)成为了必备技能之一。它可以更好地平衡CPU密集型操作和IO密集型操作的性能,使程序代码并发或并行执行,进而提高了程序的响应速度和整体性...
    99+
    2023-11-02
    异步(Async) 异步编程步骤: 线程(Thread) 回调(Callback)
  • 如何进行C++代码的并发编程?
    如何进行C++代码的并发编程随着计算机技术的发展,多核处理器和并行计算的应用越来越普遍。对于程序开发者来说,如何利用多核处理器的并行计算能力,提高程序的性能成为一个重要的课题。C++作为一个强大的编程语言,在并发编程方面提供了丰富的工具和库...
    99+
    2023-11-03
    C++并发编程
  • C++ 函数库如何进行网络编程?
    c++++ 库中网络编程通过库提供套接字 api、boost.asio 和 qt network 等功能。实战案例展示了使用 berkeley 套接字 api 构建 tcp 服务器的步骤...
    99+
    2024-04-18
    c++ 网络编程
  • 你是否知道Python和Bash如何在编程算法中相互补充?
    Python和Bash是两种非常常见的编程语言。Python是一种高级编程语言,被广泛应用于数据分析、人工智能、科学计算等领域。而Bash则是一种脚本语言,主要用于命令行环境下的自动化操作和任务处理。这两种语言看起来在应用场景和语法结构上有...
    99+
    2023-06-24
    bash 编程算法 编程算法
  • 如何在PHP中进行Socket编程?
    随着互联网技术的不断发展,越来越多的应用需要使用Socket来进行网络通信。而PHP是一种在Web应用开发中应用广泛的语言,也支持Socket编程。在本文中,我将介绍如何使用PHP进行Socket编程。一、Socket简介在介绍Socket...
    99+
    2023-05-21
    编程 PHP socket
  • 如何在电脑上进行C语言编程
    要在电脑上进行C语言编程,您可以按照以下步骤进行操作:1. 安装C语言编译器:您需要在电脑上安装C语言编译器,比较常用的编译器有GC...
    99+
    2023-09-22
    c语言
  • Java Socket如何实现UDP编程
    这篇文章主要讲解了“Java Socket如何实现UDP编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Socket如何实现UDP编程”吧!一、概述在 Jav...
    99+
    2023-07-04
  • 如何用 Hedy 进行编程
    这篇文章主要讲解了“如何用 Hedy 进行编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用 Hedy 进行编程”吧!Hedy 是一种专门为教人编程而设计的新型编程语言。学习编程既要学...
    99+
    2023-06-15
  • Laravel 中如何使用 Python 进行编程?
    Laravel 是一款流行的 PHP 开发框架,它具有简单易用、高效稳定的特点。Python 是一门广泛应用于科学计算、人工智能等领域的编程语言。那么,如何在 Laravel 中使用 Python 进行编程呢?本文将为你详细介绍。 一、Py...
    99+
    2023-07-19
    unix 编程算法 laravel
  • 如何在Python中进行网络编程
    如何在Python中进行网络编程,需要具体代码示例网络编程是现代计算机科学中非常重要的一个领域,它涉及到在网络上进行数据传输和通信的技术和方法。Python是一种强大而灵活的编程语言,它具有丰富的网络编程库,使得在Python中进行网络编程...
    99+
    2023-10-22
    Python 编程 网络编程
  • 如何进行laravel框架中的数据填充
    这篇文章给大家介绍如何进行laravel框架中的数据填充,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Laravel为了数据能够更加方便的填入数据库,专门定义了一个填充类,可以为你的数据库填充测试数据,所有的填充类都放...
    99+
    2023-06-21
  • C++ 函数库如何进行反射和元编程?
    c++++中的反射和元编程技术允许开发者在运行时检查和操作类型信息,并通过编译时技术生成或修改代码。反射使用typeid关键字返回指定类型的类型信息,而元编程使用模板元编程或预处理器宏实...
    99+
    2024-04-18
    反射 元编程 c++
  • C++ 函数在并发编程中如何进行状态管理?
    在 c++++ 并发编程中管理函数状态的常见技术包括:线程局部存储 (tls) 允许每个线程维护自己的独立变量副本。原子变量允许在多线程环境中以原子方式读写共享变量。互斥锁通过防止多个线...
    99+
    2024-04-26
    并发编程 状态管理 c++
  • HTML5中如何进行多线程编程应用
    HTML5中如何进行多线程编程应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。HTML5 中工作线程(Web  Worker)简介至 2008 年 W3C 制定出第...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作